PHP で同時処理を実装する Curl

WBOY
リリース: 2016-06-23 13:12:44
オリジナル
1176 人が閲覧しました

php は、同時実行処理の点では Java ほど優れていません。ただし、同時処理を実現する方法はあります。たとえば、curl を使用して同時 URL リクエストを実装できます。


インターネット上で、curl を使用するとブロッキングが発生する、つまり、すべてのリクエスト データが取得された後にまとめて返され、その後データが処理されると言っているのを見ました。要求されたデータを取得した後にデータを処理するのではなく。実際、この記述は間違っています。コードの実装に問題があることを示しているだけです。 php公式ウェブサイトでブロックするサンプルコードを次のように見つけました, true);

curl_multi_add_handle($mh, $curl_array[$i])

$running = NULL;

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 つずつ処理されます。取引方法に時間がかかると、プロセス全体にも非常に時間がかかります。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート