php - 面向对象的 PHP 中的非阻塞 HTTP 请求?

标签 php http oop rest pipeline

我有一个与 RESTful 服务器连接的 PHP 客户端应用程序。客户端上的每个 PHP Goat 实例都需要根据服务器上/goat 请求中的信息(例如/goat/35、/goat/36 等)来初始化自己。它通过 cURL 向其相应的 URL 发送 HTTP 请求来实现这一点。每个页面加载 30 多个山羊对象相当于 30 多个 HTTP 请求,每个请求需要 0.25 秒——这太糟糕了,就像我的山羊会说的那样。在内存中延迟加载和缓存响应有帮助,但还不够。

foreach ($goats as $goat) {
   $goat->getName() // goat needs to hit the REST API
}

这种技术的优点是我的山羊都是聪明的和封装的。缺点是性能太差了。山羊不知道如何对它们的 HTTP 请求进行排队,一只山羊不知道是否有其他山羊需要发起请求,等等。我想另一种选择是在外部构建山羊:

$urls = array('http://', 'http://', ...);  // array of goat URLs
$result = fancy_pipelined_http_request_queue($urls);
foreach ($result as $xml) {
   $goat->buildSelfFromXML($xml);
}

我确信这是一个众所周知的 OO/REST 困境,有更高级的解决方法,我只是不知道去哪里找。有什么想法吗?

最佳答案

如果你愿意,你可以使用非阻塞套接字。这涉及一些编码以切换到它们,因为您需要将 curl 放在一边。但这可能会提高性能,因为您将真正能够同时执行请求。

参见 socket_set_blocking/stream_set_blocking功能。

关于php - 面向对象的 PHP 中的非阻塞 HTTP 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463652/

相关文章:

javascript - 使来自 MySQL 数据库的选择菜单中的第一个选项值为空

java - java中的IP伪装

android - MultipartEntityBuilder 从 Android httpurlconnection 发送数据

javascript - 使用不同方法创建时创建的对象的差异

php - 使用 id 值从同一个表中获取多个值

javascript - 1次点击打开2个链接

php - LAMP/CakePHP 怪癖 - 在本地工作,而不是在远程服务器上。调试技巧?

javascript - AngularJS 循环通过 http get req 找到正确的 url

javascript - JS封装问题: "this.foo = new function(){...};" vs "this.Bar = function(){..}; this.foo = new Bar();"

java - 我是否违反了 "open/closed"原则?