shell_exec を使用して、完了までに約 30 秒かかる外部プログラムを実行する作業中の php スクリプトがあります。問題は、ユーザーがブラウザーを閉じたり、何らかの理由で接続が閉じられたりした場合、 shell_exec で実行されたプログラムは、出力をユーザーに送信できなくなるため、何もせずに実行し続けることです。
接続が閉じられるとすぐにこのプロセスを強制終了する方法はありますか?
ご協力ありがとうございました。
shell_exec を使用して、完了までに約 30 秒かかる外部プログラムを実行する作業中の php スクリプトがあります。問題は、ユーザーがブラウザーを閉じたり、何らかの理由で接続が閉じられたりした場合、 shell_exec で実行されたプログラムは、出力をユーザーに送信できなくなるため、何もせずに実行し続けることです。
接続が閉じられるとすぐにこのプロセスを強制終了する方法はありますか?
ご協力ありがとうございました。
最後に私はそれを解決しました!
PHP 関数connection_aborted()
を使用して、クライアントが切断されているかどうかを確認しました。
http://us2.php.net/manual/en/function.connection-aborted.php
アルゴリズムは次のとおりです(疑似コード)
shell_exec("script");//script is a shell script that launch the program in another thread thus this return immediately
$task_completed=false;
while(!$task_completed){
if(connection_aborted()==1){
kill_the_process();//this will kill the running process launched by script
die();
}
$task_completed=...;//true if the task completed
sleep(1);
}
実行中のphpスクリプトを実行/実行/停止するマネージャーを作成できます。このスクリプトは、おそらくデーモンとして常に実行され、スクリプト/プロセスのステータス、ユーザーのステータスをチェックし、ユーザーがいなくなった場合はスクリプトを閉じます。ソケットでこれをうまく行うことができると思います。
JavaScript\HTML でソケットを使用するには?
http://php.net/manual/en/book.sockets.php