24

ユーザーがボタンをクリックしたとすると、jqueryajaxリクエストがサーバーに送信されます。

サーバーは、ajaxリクエストに応答して複雑なプロセスを開始します。プロセスが完了するまでに5分かかるとしましょう。

その間、ユーザーは退屈してブラウザウィンドウを閉じます。

サーバー上のスクリプトは、通常の時間に終了するまで処理を続行しますか、それとも停止しますか?

ユーザーがURLにアクセスした場合も同じです(例:example.com/process.php?data=xxx)。これにより、データの処理を開始するprocess.phpが開始され、処理が完了するまで5分かかります。

この処理は常に続行されますか、それともユーザーがブラウザを閉じると停止しますか?

(プロセスが半分終了したままになり、データが破損するのではないかと心配しているので、質問しています)。

4

4 に答える 4

31

PHPは、何か(echoなど)を出力しようとしない限り、ブラウザが接続を閉じたことに気づきません。何かを出力できない場合、ignore_user_abortOnでない限り、スクリプトは終了します。

したがって、スクリプトは次の条件が満たされた場合にのみ終了します。

  • スクリプトは何かを出力しようとします(スクリプトはそれまでユーザーが接続を中止したことに気付かないため)
  • AND phpのignore_user_abort設定がオフになっている(設定がオフの場合、何かを出力できない場合、phpはスクリプトを終了します)

を有効にすると、スクリプトが終了するのを防ぐことができignore_user_abortます。

connection_aborted()ブラウザがリクエストを中止したかどうかをいつでも確認できます。

スクリプトは、他の理由(最大実行時間、例外など)で予期せず終了する可能性があります。したがって、スクリプトが異常終了した場合に途中で終了した変更がキャンセルされるように、トランザクションを利用する必要があります。

于 2012-07-06T10:19:05.633 に答える
3

http://php.net/manual/en/function.ignore-user-abort.phpを参照してください。これは、ignore_user_abort設定と他のいくつかの条件によって異なります。

于 2012-07-06T10:21:24.917 に答える
1

PHPのデフォルトの動作では、リモートクライアントが切断されるとスクリプトが中止されます。これは通常、ユーザーがブラウザを閉じるか、停止ボタンを押すことによって発生します。また、CLIモードで実行されているスクリプトへのリモート接続を誰かが閉じた場合にも発生する可能性があります。スクリプトの中止の1つの例外は、を使用してシャットダウン関数を登録した場合ですregister_shutdown_function()。詳細な説明については、PHPドキュメントの接続処理ページを参照してください。

スクリプトが実際に終了するポイントは、flush()が呼び出されたタイミングによって異なります。これは、基本的に、現在の出力をブラウザ/クライアントにプッシュしようとします。この時点で、接続の状態がである場合、ABORTEDユーザーの中止を無視しない限り、スクリプトは終了します。

注意すべき重要な点は、この動作が発生するかどうかを制御できることです。これは、発生することが望ましくない場合があることを指定するためです。関数を使用するignore_user_abort()か、php.iniで関連するディレクティブを設定します。

于 2012-07-06T10:43:12.677 に答える
-2

バックグラウンドプロセスとして起動されない限り、つまり最後に&が付いている場合を除き、終了します。

ブラウザをもう少し閉じます...最終的には停止しますが、Webサーバーが接続が切断されたことを認識する前にしばらく処理されます。

于 2012-07-06T10:17:50.593 に答える