逐次処理では時間がかかり kill されてしまうので、マルチスレッドで非同期通信をすれば制限時間内で完了できそう。しかし、調べていてわかったのは、PHP にはマルチスレッド処理がないらしい。いくつか対応策が見つかって、fork して子プロセスを作るとか、exec 関数を使ってバックグラウンドで処理させるとか。
いくつかサンプルが見つかったものの、上手く動作するものがみつからなかった。動作させるために問題を見つけて対処するべきなのだが、他に動作するサンプルがあるならそちらを優先したいと思っていくつか試した。決して面倒だとか・・。
スポンサードリンク
実行結果
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /virtual/user_idpublic_html/www.example.com/s_curl_php5.php on line 39 Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /virtual/user_idpublic_html/www.example.com/s_curl_php5.php on line 39 Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /virtual/user_idpublic_html/www.example.com/s_curl_php5.php on line 39 Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /virtual/user_idpublic_html/www.example.com/s_curl_php5.php on line 39 実行結果: Array ( [0] => pid=1 [1] => pid=2 [2] => pid=3 [3] => pid=4 ) -- time:5 sec
見た感じサンプルはウェブからアクセスするように見えるが、ウェブからアクセスしてみたところ、エラーが表示された。シェルから実行したところ、エラーは表示されなかった。
> php ./public_html/www.example.com/s_curl_php5.php Content-type:text/html; charset=UTF-8 実行結果:<pre>Array ( [0] => pid=1 [1] => pid=2 [2] => pid=3 [3] => pid=4 ) </pre>--<br />time:5 sec
ちなみに「IN THE FIELD : CORESERVER.JPのモジュール一覧(Apache、PHP編) – livedoor Blog(ブログ) 」をみるとcurl が利用できるようなので、CORESERVER で実行した。
どのみちcron でまわすのでシェルから実行できれば問題ない。また、ウェブからアクセスしてみた時にモジュール版だったかCGI 版だったかは覚えていない。調べるにはphpinfo(); を使い、curl セクションがあるか確認すれば良い。
ステータスコード
今回、マルチスレッド処理を必要としたのは複数の接続先に対してHTTP レスポンスコードが欲しかったから。ステータスコードを始めとする様々な情報は以下のようにしても取得できる。
# $res[$i] = curl_getinfo($conn[$i]['http_code']); [url] => http://www.example.com/s_curl_sleep.php?pid=2 [content_type] => text/html [http_code] => 200 [header_size] => 144 [request_size] => 73 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 5.011846 [namelookup_time] => 8.0E-6 [connect_time] => 6.2E-5 [pretransfer_time] => 0.001175 [size_upload] => 0 [size_download] => 5 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 0 [upload_content_length] => 0 [starttransfer_time] => 5.010892 [redirect_time] => 0
かなり細かい情報も取得できるようで、ここで得られる情報だけを利用しても面白いサービスが作れそうな気がしなくもない。
サンプルソース
- PHPでマルチスレッド(バックグラウンド処理)を実現する方法 – EC studio 技術ブログ
参考文献
- PHP マルチスレッド処理(並行処理)を実行する方法 – Challenge4Life 〜PHPとMySQLのこと、少しの雑記と少しのアフィリエイト Challenge4Life〜
- PHP: cURL 関数 – Manual
- warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated | drupal.org
- PHP/非同期処理(マルチスレッド処理、バックグラウンド処理) – PapuuWiki
- SE奮闘記: 【PHP】バックグラウンド(非同期)で処理を実行する
コメント