またまた自作フレームワーク用に組み込みたかった機能の話
特にfile_get_contentsなどの相手側の応答いかんで処理時間がかわるような場合
同時にだーって流しておきたいなーとはおもったんですが、
考えていたやりかたはモジュール版だと使えないということが発覚・・
(pcntl_forkって関数)
で今回みっけたのは curl_multi
PHP curl_multi example of parallel GET requests
注意点としては、各ハンドラが独自にキャッシュしてるから
ハンドルを変更せず再度 curl_multi_exec しても
トライせずにキャッシュを返すことかなぁ
(その場合一旦ハンドラを解除して再セットすればOKらしい)
なので、こんな感じでクラスを作って
localhostのphpファイルを呼び出せば
簡単にマルチスレッドでプログラムが動かせると。
まあよっぽどのことがないと使わないとおもいますが。
というかこれ、どこまでいけるんだろう。
Class Parallel { public $result; public function __construct() { } public function execute($urlList = array()) { if (count($urlList) > 0) { $channel = array(); $uniqueUrls = array(); $uniqueUrls = array_unique($urlList); //マルチプロセスハンドラ $multiHandle = curl_multi_init(); //URLに一つづつチャンネルを割り当てる foreach ($uniqueUrls as $k=>$v) { $channel[$k] = curl_init($v); curl_setopt($channel[$k], CURLOPT_RETURNTRANSFER, 1); curl_multi_add_handle($multiHandle,$channel[$k]); } while (CURLM_CALL_MULTI_PERFORM == ($execReturn = curl_multi_exec($multiHandle,$isActive))) { } while ($isActive && $execReturn == CURLM_OK) { if (curl_multi_select($multiHandle) != -1) { while (CURLM_CALL_MULTI_PERFORM == ($execReturn = curl_multi_exec($multiHandle,$isActive))) { } } } if ($execReturn != CURLM_OK) { return false; } $resultData = array(); foreach ($uniqueUrls as $k=>$v) { $curlError = curl_error($channel[$k]); if ($curlError == "") { $resultData[$k] = curl_multi_getcontent($channel[$k]); } else { $resultData[$k] = 'error'; } curl_multi_remove_handle($multiHandle,$channel[$k]); curl_close($channel[$k]); } curl_multi_close($multiHandle); $this->result = $resultData; return true; } else { return false; } } }