ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:非同期処理の方法を調べた

出来たのはいいが、わからない点もある。

f:id:AJYA:20121116213807j:plain

photo credit: Thorbard via photopin cc

 

ことの発端

PHPCSVファイルを生成して、ダウンロードを行うプログラムがあるが、データの取得に時間がかかりすぎて、ブラウザが待機時間を過ぎて、タイムアウトしてしまう。

CSVファイルを生成しないで、データを取得したらすぐに出力するようにしても、サーバーの負荷によっては遅くなるためか、途中でデータの出力が終わったと判定されて、途中までのCSVファイルがダウンロードされてしまう。

 

どう対処するか

AjaxCSVファイル生成のプログラムを起動して、CSVファイルが生成されるまでポーリングして、生成されたらAjaxでファイルダウンロードを呼び出して、ダウンロードを行うというのを考えた。

 

できるかどうか検証

AjaxCSVファイルの生成のPHPプログラムを起動したいが、起動したら待機しないですぐ戻る(戻らないとAjaxで呼び出し側に戻って次の処理に移れない)、非同期処理ができるかどうか、まず試した。

 

検証結果

以下のように

exec("/usr/local/bin/php ./process.php > /dev/null &");

としたら非同期で動作した。

 

わかっていない部分

/dev/null &にリダイレクトすると非同期になって、リダイレクトがないと同期になる理由がよくわからない。

出力を捨てるだけで、なぜ非同期になるんだろう。

/dev/null - Wikipedia

まずは一歩すすんだので、次の一歩進められるようにしたい。