出来たのはいいが、わからない点もある。
photo credit: Thorbard via photopin cc
ことの発端
PHPでCSVファイルを生成して、ダウンロードを行うプログラムがあるが、データの取得に時間がかかりすぎて、ブラウザが待機時間を過ぎて、タイムアウトしてしまう。
CSVファイルを生成しないで、データを取得したらすぐに出力するようにしても、サーバーの負荷によっては遅くなるためか、途中でデータの出力が終わったと判定されて、途中までのCSVファイルがダウンロードされてしまう。
どう対処するか
AjaxでCSVファイル生成のプログラムを起動して、CSVファイルが生成されるまでポーリングして、生成されたらAjaxでファイルダウンロードを呼び出して、ダウンロードを行うというのを考えた。
できるかどうか検証
AjaxでCSVファイルの生成のPHPプログラムを起動したいが、起動したら待機しないですぐ戻る(戻らないとAjaxで呼び出し側に戻って次の処理に移れない)、非同期処理ができるかどうか、まず試した。
検証結果
以下のように
exec("/usr/local/bin/php ./process.php > /dev/null &");
としたら非同期で動作した。
わかっていない部分
/dev/null &にリダイレクトすると非同期になって、リダイレクトがないと同期になる理由がよくわからない。
出力を捨てるだけで、なぜ非同期になるんだろう。
まずは一歩すすんだので、次の一歩進められるようにしたい。