ホームページ >バックエンド開発 >PHPチュートリアル >PHP スクリプトを使用してクライアントのブラウザが切断されたかどうかを確認する方法
PHP スクリプトを使用してクライアントのブラウザが切断されたかどうかを確認するにはどうすればよいですか?
私はある人が次のような投稿をしたことがあります:
PHP 内では、システムは接続ステータスを維持し、そのステータスには 3 つの状況が考えられます。
0 - 通常
1 - 中止されました
2 - TIMEOUT (タイムアウト)
PHP スクリプトが NORMAL 状態で正常に実行されている場合、接続は有効です。リモート クライアントが切断されると、ABORTED ステータス フラグがオンになります。リモート クライアント接続の中断は、通常、ユーザーが [STOP] ボタンをクリックしたことによって発生します。接続時間が PHP の制限時間 (set_time_limit() 関数を参照) を超えると、TIMEOUT ステータス フラグがオンになります。
クライアントが切断されたときにスクリプトを終了する必要があるかどうかを決定できます。場合によっては、スクリプトの出力を受け入れるリモート ブラウザがない場合でも、スクリプトを完全に実行させると便利な場合があります。デフォルトでは、リモート クライアント接続が失われたときにスクリプトが終了します。このプロセスは、php.ini のignore_user_abort によって、または Apache .conf 設定の対応する "php_valueignore_user_abort" およびignore_user_abort() 関数によって制御できます。ユーザーの中断を無視するように PHP に指示しない場合、 register_shutdown_function() 経由でシャットダウン トリガー関数を設定しない限り、スクリプトは中断されます。このクローズ トリガー関数により、リモート ユーザーが [STOP] ボタンをクリックし、スクリプトがデータを再度出力しようとすると、PHP は接続が中断されたことを検出し、クローズ トリガー関数を呼び出します。
スクリプトが組み込みのスクリプト タイマーによって中断される可能性もあります。デフォルトのタイムアウト制限は 30 秒です。この値は、php.ini の max_execution_time を設定するか、Apache.conf 設定の対応する「php_value max_execution_time」パラメータを設定するか、set_time_limit() 関数を使用して変更できます。カウンタがタイムアウトすると、上記の接続中断状況と同様にスクリプトが終了し、事前に登録されたシャットダウン トリガー関数もこの時点で実行されます。そのシャットダウン トリガー関数では、connection_status() 関数を呼び出すことで、タイムアウトによってシャットダウン トリガー関数が呼び出されたかどうかを確認できます。タイムアウトによりシャットダウントリガー関数が呼び出された場合、関数は 2 を返します。
注意すべき点の 1 つは、ABORTED 状態と TIMEOUT 状態が同時に有効になる可能性があるということです。これは、ユーザーの終了アクションを無視するように PHP に指示した場合に可能になります。 PHP はユーザーが切断されたことを認識しますが、スクリプトはまだ実行中です。実行時間制限に達すると、スクリプトは終了し、設定されたシャットダウン トリガー関数も実行されます。この時点で、関数 connection_status() が 3 を返すことがわかります。
しかし、私のテストの結果は、バックエンドがフロントエンドに出力しない場合、たとえば、while 処理の無限ループで、フロントエンドにコンテンツが出力されない場合、connection_status() は常に 0 になります。フロントエンドは、フロントエンドが切断されていることを知りません。