基本上,我正在尋找一個方式做在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中完成?