2009-08-14 9 views
37

私は比較的時間がかかるスクリプトをいくつかのフォーム入力に基づいて実行したいと思っていますが、私はむしろcronに頼っていません。したがって、ajaxを通して要求されたPHPページが完了するまで実行を続けるか、ユーザーがページを離れる場合。ユーザーがページを離れるとPHPの実行が停止しますか?

ファイルの終わりにjson_encodeがあるまで実際にはブラウザに出力されないので、それまでのすべてがまだ実行されますか?

答えて

67

です。 http://us3.php.net/manual/en/features.connection-handling.phpから

PHPスクリプトが正常に NORMAL状態が実行されている場合は、アクティブです。 リモートクライアントがABORTEDを切断した場合 状態フラグがオンになっています。リモートの クライアントの切断は、通常、ユーザが のSTOPボタンを押すことによって引き起こされます。

クライアントを切断して スクリプトを中止するかどうかを決定できます。ときには 出力を受信して​​いない場合でも、常にあなたのスクリプトを実行すると便利です 完了するには便利です。 リモートクライアントの接続が切断されると、デフォルトの動作で スクリプトが中止されます。この 動作は ならびに対応する php_value ignore_user_abort Apacheの のhttpd.confディレクティブを介して、または ignore_user_abort()機能を ignore_user_abort php.iniのディレクティブを使って設定することができます。

あなたの質問に対する答えは、「はい、ユーザーがページを離れるとスクリプトは終了します」と思われるようです。

しかし、使用されているバックエンドSAPI(たとえば、mod_php)によると、php cannot detect that the client has aborted the connection until an attempt is made to send information to the clientです。長時間実行しているスクリプトでflush()が発行されない場合は、ユーザーが接続を閉じてもスクリプトが実行され続けることがあります。

物事を複雑にし、あなたがトラップし、それらの呼び出しの原因となりますのoutput bufferingを持つ、flush()に問題定期的な呼び出しを行う、スクリプトがとにかく完了するまでクライアントにそれらを送信しません場合でも、です!物事を複雑

さらにもう一度PHPは、接続が閉じていることを検出せず、スクリプトがトラック輸送し続けます、その後(たとえばmod_gzip用)応答をバッファApacheのハンドラをインストールしている場合です。

Phew。

+5

非常に詳細+1 –

6

これは設定によって異なりますが、通常は停止しますが、ignore_user_abort()を使用して実行することができます。

+5

クライアントに送信することはできませんが、これは多くのシナリオで発生する可能性があります。私の答えを見てください。 –

1

Webサーバーおよび/またはPHPの構成によっては、ユーザーがHTTP接続を終了したときにPHPプロセスがスレッドを強制終了することもあれば、終了しないこともあります。ユーザーがページから離れたときにAJAXリクエストが保留されている場合は、リクエストを殺すブラウザに依存します(保証対象外)サーバの設定(保証対象外)。あなたが聞きたい答えではありません!

常に実行中のPHP daemonがジョブをポーリングできるフラットファイルまたはデータベースで作業キューを作成することをお勧めします。 cron遅延はありませんが、CPU /メモリ使用量は使用可能なレベルに保たれます。ジョブが完了したら、AJAXフェッチ用のフラットファイル/データベースに結果を配置します。または、ジョブが完了したらユーザーに電子メールを送信することを約束します(私が推奨する方法)。

希望するものは

0

クライアント/ユーザ/ダウンローダ/ビューアが中止または切断された場合、スクリプトはを実行し続けます。何かが新しいデータをフラッシュするまでクライアントはを実行します。 ignore_user_abort()を使用していない限り、スクリプトはそこで死にます。 同じ順序で、PHPは、httpdにデータをフラッシュすることなく、クライアントがまだそこにいるかどうかを判断することができません。

0

私の場合、接続を終了しない実際の解決策が見つかりました。私のApache/PHPサーバ上のセッションは、次のセッションが開始される前に閉じる必要がありました。データならば `はignore_user_abort()は`の動作が保証されていないことをhttp://www.php.net/manual/en/function.ignore-user-abort.phpで大きな脂肪の警告があります

Browser waits for ajax call to complete after abort.

関連する問題