2009-09-23 28 views
1

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

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); 
} 

我敢肯定,这是一个众所周知的面向对象/休息的困境,有更先进的解决方法,我只是不知道在哪里看。有任何想法吗?

+1

我仍然对建议感兴趣,但在此期间,请检查一下。每只山羊都使用自己的卷曲手柄作为私人变量。作为一个测试,我使它变为静态的(所以一个句柄可以在所有的山羊之间共享),现在需要8秒加载的页面现在需要0.9。我认为这一切都是由于HTTP请求延迟... – alexantd 2009-09-23 03:01:03

+0

@alexantd,一如既往,配置文件第一,责备第二:) – vava 2009-09-23 03:17:16

+0

相似/ Dublicate:http://stackoverflow.com/questions/1432477/can-php-asynchronously-使用的套接字 – 2009-09-23 06:57:36

回答

1

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

请参阅socket_set_blocking/stream_set_blocking函数。