web-dev-qa-db-ja.com

Kill PHP接続が閉じられたときに処理する

次の質問をSOに投稿しましたが、サーバーベースのソリューションがあるのではないかと思いました。

https://stackoverflow.com/questions/9053964/php-script-with-sleep-does-not-exit-on-connection-close

このスクリプトを実行するためにUbuntuVPSを実行していますが、ユーザーがブラウザーのウィンドウ/タブを閉じたときにスクリプトを停止させようとしています。

接続がまだ開いているかどうかを確認するためのいくつかのPHPベースの関数がありますが、どれも機能しません(私を信じて、それらすべてをテストしました)。

サーバーを介してこれを行う方法についての創造的なアイデアはありますか?

2
user838437

https://stackoverflow.com/questions/23530820/php-connection-aborted-does-not-always-works/29401757#29401757

TCPでは、送信されたすべてのパケットがクライアントによって確認応答される必要があるため、サーバーはこれを少なくとも送信タイムアウトとして検出する必要があります...

session_write_close();//to make flush work
while (connection_status() !== 0) {//this will work if the connection is properly shutdown
                                   //or if it is simply disconnected...
  sleep(1);
  echo "whatever";
  ob_flush();
  flush();
}
1
user3338098

これらのメソッドを試しているときに、PHPにバッファをフラッシュするように強制しましたか?スクリプトから何かが書き込まれるまで、PHP/Apacheはクライアントがまだ接続されているかどうかを確認できません。 。PHPはクライアントと直接通信しておらず、Apacheと通信していることに注意してください。

コメントは connection_aborted PHP manual にはいくつかの戦略が含まれています。

1
Andrew M.

Webブラウザーが接続を閉じていない場合は、接続がタイムアウトするか、PHPの最大実行時間に達するまでスクリプトが実行され続ける可能性があります。

私が考えることができる最善のことは、AJAXを使用して、サーバーに定期的に「ping」を実行し、しばらくの間それらのpingを受信しなかったときに停止することです。または、pingを受信するたびに、 PHPスクリプトを実行するのにあと5秒。

または、AJAXを使用して、ユーザーがウィンドウを閉じたときにサーバーにメッセージを送信することもできますが、一部の新しいブラウザーでは、迷惑なポップアップ広告などによく使用されるため、この機能が無効になっていると思います。 。

0
Grant