PR

[PHP] マルチスレッド処理

逐次処理では時間がかかり 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 技術ブログ

参考文献

 

コメント