ホームページ >バックエンド開発 >PHPチュートリアル >PHP で同時処理を実装する Curl
php は、同時実行処理の点では Java ほど優れていません。ただし、同時処理を実現する方法はあります。たとえば、curl を使用して同時 URL リクエストを実装できます。
インターネット上で、curl を使用するとブロッキングが発生する、つまり、すべてのリクエスト データが取得された後にまとめて返され、その後データが処理されると言っているのを見ました。要求されたデータを取得した後にデータを処理するのではなく。実際、この記述は間違っています。コードの実装に問題があることを示しているだけです。 php公式ウェブサイトでブロックするサンプルコードを次のように見つけました, true);
curl_multi_add_handle($mh, $curl_array[$i])
curl_multi_exec($mh,$running); $running > 0);
$ res = array();取得データ
* @param: $urls 配列 URL リスト
* @param: $callback string 処理が必要なコールバック関数。例: func(array)
*/
functioncurl($urls = array(), $callback = '')
{
$response = array();
if (empty($urls)) {�� =カール_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 0);
curl_setopt ($ch, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($chs, $ch);
if (($status = Curl_multi_exec ($ CHS, $ Active)! = Curlm_call_multi_perform) {if ( $ Status! = CURLM_OK) {Break;} // Cur_multi_exe を再度実行します ($ Done = Curl_multi_info_read ($ CHS )) {
$info =curl_getinfo($done["handle"]); ["ハンドル"]) ;
$url = $map[strval($done["ハンドル"])];
$rtn = Compact('info', '結果'、'URL') ;
[$url] = $rtn;
curl_multi_remove_handle($chs, $done['handle']); curl_close($done[ 'ハンドル']);
curl_multi_select($chs, 0.5);約 0.5 秒間ブロックが発生します。curl_multi_close($chs);
return $response;
}
//
function deal($data){
if ($data["error"] == '') の使い方) {
echo $data["url"]." -- ". $data["info"]["http_code"]."n";
} else {
} echo $data["url" ]." -- ".$data["error"]."n";
}
}
$urls = array();
for ($i = 0; $i
$urls[] = 'http://www.baidu.com/s?wd=etao_'.$i;
$urls[] = 'http://www.so.com/s ?q=etao_'.$i;
$urls[] = 'http://www.soso.com/q?w=etao_'.$i;
}
curl($urls, "取引" );
注:
1.curl_multi_exec 関数について 戻り値:
Curl_multi_exec をすぐに再度呼び出す必要があることを示す CURLM_CALL_MULTI_PERFORM を返します。
処理する必要のあるデータがあることを示す CURLM_OK を返します。このとき、該当する処理を実行し、処理後に再度curl_multi_execを呼び出す必要があります。
phpのcurl_multi_execは、呼び出されるcurlライブラリのcurl_multi_performメソッドです。コードはmulti.cの230行目あたりです。
2. この方法はデータ取得とデータ処理においては並列ですが、データ処理においては依然として直列です。つまり、データは 1 つずつ処理されます。取引方法に時間がかかると、プロセス全体にも非常に時間がかかります。