2009-09-23 101 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函數。