2013-08-20 26 views
0

基本上,我正在尋找一個方式做在PHP中的以下內容:PHP:HTTP GET/POST在一個真正的異步方式

http_get_or_post('an.url', 'or.two'); 

// Do some work here, not worrying about the http going on in the background. 

$r = wait_for_and_get_the_results_of_the_http_requests() 

也許有人更捲曲的經驗可以證實,curl_multi是什麼我在找。

從我從http://php.net/manual/en/function.curl-multi-init.php收集,樣品有可能給我我需要什麼:

$ch1 = curl_init(); 
curl_setopt($ch1, CURLOPT_URL, "http://www.php.net/"); 
curl_setopt($ch1, CURLOPT_HEADER, 0); 
$mh = curl_multi_init(); 
curl_multi_add_handle($mh,$ch1); 

$active = null; 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

// Now, am I free to do some time consuming work here and not worry about 
// calling curl_multi_exec every now and then to facilitate the background 
// http/socket processes? 

while ($active && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

curl_multi_remove_handle($mh, $ch1); 
curl_multi_close($mh); 

現在,主要的問題是,我的這是什麼會做正確的認識?

1)第一個循環將只負責發送/寫入請求到套接字。

2)所有的http/socket的東西都會在請求發送後發生在後臺,讓我可以自由地做其他的事情,而不必定期調用curl_multi_exec來確保某個緩衝區沒有滿的地方並且需要一腳繼續前進。

3)第二個循環將等待任何未完成的響應數據到達並完成讀取和處理響應。

現在,這仍然不能完全異步 - 我可能會成爲擋在寫作應該套接字寫緩衝區填滿的請求,但在我的情況,這不是一個問題,我只擔心不必調用curl_multi_exec而我正在做中間的其他東西,這樣整個事情就不會凍結,直到我調用curl_multi_exec的下一個機會。

對於2k-4k響應的一般情況,我也很好,更大的響應在背景中無所事事,直到我到達第二個循環。

這是curl_multi的工作原理嗎?如果不是的話,你會發現什麼可以在PHP中完成?

回答

0

curl_multi一次只做了很小的工作。每次調用curl_multi_exec都會執行傳輸操作的一小段內容,一旦您調用了足夠多的次數並且數據已經發送和接收,就完成了。

0

剛做了一些測試,簡而言之 - 不,這不是它如何與curl_multi一起工作的 - 您需要不斷調用curl_multi_exec,沒有這一點,第一個循環只會設法在連接上執行TCP握手,甚至沒有發出請求。

這是一個恥辱,mysqli使用mysqlnd可以做異步請求,爲什麼不能捲曲?