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

时间:2009-09-23 02:17:41

标签: php http oop rest pipeline

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

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困境,有更先进的解决方法,我只是不知道在哪里看。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

查看socket_set_blocking / stream_set_blocking个功能。