【问题标题】:Non-blocking HTTP requests in object-oriented PHP?面向对象的 PHP 中的非阻塞 HTTP 请求?
【发布时间】:2010-11-30 14:57:13
【问题描述】:

我有一个与 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 困境,有更高级的解决方法,我只是不知道去哪里找。有什么想法吗?

【问题讨论】:

  • 我仍然对建议感兴趣,但与此同时,请检查一下。每个 Goat 都使用自己的 curl 句柄作为私有变量。作为测试,我改为将其设为静态(因此可以在所有山羊之间共享一个句柄),并且需要 8 秒加载的页面现在需要 0.9。我以为这都是由于 HTTP 请求延迟...
  • @alexantd,一如既往,先介绍,后责备:)

标签: php http oop rest pipeline


【解决方案1】:

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

参见socket_set_blocking / stream_set_blocking 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多