フォーム入力に基づいて比較的時間のかかるスクリプトを実行したいのですが、cron に頼りたくないので、ajax を介して要求された php ページが完了するまで実行し続けるのか、それともユーザーがページを離れます。
ファイルの最後にある json_encode まで実際にはブラウザに出力されないので、それより前のすべてはまだ実行されますか?
場合によります。
http://us3.php.net/manual/en/features.connection-handling.phpから:
PHP スクリプトが正常に実行されている場合、NORMAL 状態がアクティブです。リモート クライアントが切断すると、ABORTED 状態フラグがオンになります。通常、リモート クライアントの切断は、ユーザーが STOP ボタンを押すことによって発生します。
クライアントの切断によってスクリプトが中止されるようにするかどうかを決定できます。出力を受信するリモート ブラウザがない場合でも、スクリプトを常に最後まで実行できると便利な場合があります。ただし、デフォルトの動作では、リモート クライアントが切断されるとスクリプトが中止されます。この動作は、
ignore_user_abort
php.ini ディレクティブ、対応するphp_value ignore_user_abort
Apache httpd.conf ディレクティブ、またはignore_user_abort()
関数を介して設定できます。
あなたの質問に対する答えは「はい、ユーザーがページを離れるとスクリプトは終了します」と言っているようです。
ただし、使用されているバックエンド SAPI (例: mod_php
)によっては、情報をクライアントに送信しようとするまで、php はクライアントが接続を中止したことを検出できないことに注意してください。長時間実行されるスクリプトが を発行しない場合flush()
、ユーザーが接続を閉じてもスクリプトは実行を続ける可能性があります。
を定期的に呼び出す場合でも、出力バッファリングをオンにすると、これらの呼び出しがトラップされ、スクリプトが完了するまでクライアントに送信されないため、事態が複雑になります。flush()
さらに複雑なことは、応答をバッファリングする Apache ハンドラをインストールした場合 (たとえばmod_gzip
)、再び php が接続が閉じられたことを検出せず、スクリプトが追跡を続けることです。
ふぅ。
設定によって異なります - 通常は停止しますが、 を使用ignore_user_abort()
して続行することができます。
クライアント/ユーザー/ダウンローダー/ビューアーが中止または切断された場合、何かがクライアントから新しいデータをフラッシュしようとするまで、スクリプトは実行を続けます。を使用していない限り
ignore_user_abort()
、スクリプトはそこで終了します。同じ順序で、PHP はデータを httpd にフラッシュしない限り、クライアントがまだそこにあるかどうかを判断できません。
Web サーバーや PHP の構成に応じて、ユーザーが HTTP 接続を終了したときに PHP プロセスがスレッドを強制終了する場合としない場合があります。ユーザーがページから離れたときに AJAX リクエストが保留中の場合、サーバー構成 (保証されていません) の上でリクエストを強制終了する (保証されていません) ブラウザーに依存しています。あなたが聞きたい答えではありません!
常に実行されているPHP デーモンがジョブをポーリングできるフラット ファイルまたはデータベースにワーク キューを作成することをお勧めします。遅延に悩まされることはありませんが、cron
CPU/メモリの使用を使用可能なレベルに保ちます。ジョブが完了したら、AJAX フェッチ用のフラット ファイル/データベースに結果を配置します。または、ジョブが完了したらユーザーに電子メールを送信することを約束します (私の好みの方法)。
それが役立つことを願っています
接続を終了しないという私の場合の実際の解決策を見つけました。次のSESSIONを開始する前に、Apache/PhpサーバーのSESSIONを閉じる必要がありました。