ブラウザからPHPプログラムにアクセスして処理を起動。

時間がかかる処理なので、バッチ処理のようにしたいです。
エラーなどはサーバーのログファイルに出力して画面に返却する必要はありません。

そのままHTTPで処理待ちをするとapacheがタイムアウトしてしまいます。
タイムアウト時間を延ばすことはしたくありません。

理想としては
HTTPからアクセスがあり、処理起動する。
すぐにHTTPに処理終了を返す。
しかし処理は継続して行う。

どのような組み込みを行えばよいでしょうか。

使えるものは、php5 apache2.2 Jqueryです。

回答の条件
  • URL必須
  • 1人5回まで
  • 13歳以上
  • 登録:2011/08/25 16:49:21
  • 終了:2011/09/01 16:50:02

回答(2件)

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752011/08/25 17:14:34

ポイント100pt

大雑把な流れとしては、

1.ブラウザでアクセスしたPHPスクリプトで、system関数などで別プロセスを起動して終了。

2.起動された別プロセスの処理で時間のかかる処理を実行する。

3.2の処理状況を表示するスクリプトを用意する

4.1の結果画面のJavaScriptにおいて定期的に3のスクリプトにアクセスして実行状況を確認


というのが抽象的な流れが一般的でしょうか。

ただし、レンタルサーバによっては制約がかかっていて、sysytem関数が使えない、処理が一定時間で打ち切られてしまうなどの場合があります。この場合は、2の処理をcronからの起動に変えたり、処理を細切れにして複数回の実行によって実現するなど工夫が必要です。

この流れを複数回実行するためには、この流れの識別IDみたいなものが必要になります。


1でIDを生成

2のスクリプトはパラメタとしてIDを受取り、処理結果はそのIDの状況として記録する

3のスクリプトはパラメタとして受け取ったIDに関する状況を表示する

4のJavaScriptにIDを埋め込んでおき、そのIDを添えて3のスクリプトへアクセスする


というような形で関連付けられます。


そして、このIDをどう扱うかで実装方針は色々あるでしょう。

DBを使うか、ファイルシステムを使うかが簡単でしょう。

DBを使うのであれば、1で状況テーブルのようなものでも作って、2でその状況を更新し、4からのリクエストに応じて3がその行にアクセスするという形でいいでしょう。

ファイルシステムを使うのであれば、1でIDのディレクトリを作成し、2でそのディレクトリ内に状況をファイルとして格納して、4からのリクエストに応じて3がそのファイルの内容を表示するという感じでしょうか。終わったかどうかのような単純な情報しか残す必要がないのであれば、ディレクトリを作らずにファイルでもいいでしょう。


また、cronからの起動にした場合は、2の起動にIDをパラメタとして渡すことができなくなるので、DBの行の登録日時や、ファイルのタイムスタンプの古いものからなどと判別しなければならないでしょう。

何かの参考になれば。

http://dummy

id:Jupiter2100 No.2

じゅぴたー回答回数444ベストアンサー獲得回数742011/08/25 18:19:20

ポイント100pt

PHPスクリプトをCGI化して、CLI版のPHPで動作させるようにしてみてはどうでしょう。

Apacheとは別プロセスで動くようになります。


具体的な手順は「PHP をコマンドラインから使用する」をご覧ください。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません