2011-09-29 72 views
0

當我通過按瀏覽器的「停止」按鈕取消PHP腳本時,看起來exec(..)運行的外部二進制文件沒有停止。如果服務器配置爲不處理每個用戶多於一個的腳本,則會在運行命令完成之前禁用任何用戶活動。我怎麼能告訴PHP在取消時殺死執行的進程?php stop shell exec取消

+0

看看這個問題:http://stackoverflow.com/questions/7582485/kill-mysql-query-on-user-abort/7582527#7582527 – Rijk

回答

1

總之,有一個難點。

你的瀏覽器對服務器說:「做這個頁面」,然後服務器回覆它在運行腳本時得到的結果。如果客戶端消失,服務器通常仍會完成腳本,而瀏覽器是否聽取該信息。

我唯一能想到的方式是,如果服務器是UNIX,那麼可以嘗試一些方法來確定運行命令的PID,並且如果您閱讀了http://php.net/manual/en/features.connection-handling.php,則可以設置事件發生在斷開連接時。接下來你可以讓PID運行另一個命令來終止命令。

但是,我不想保證結果。

+0

「如果客戶端消失,服務器通常仍然完成腳本「似乎不對。如果用戶關閉連接,PHP可以取消執行(至少應該用我認爲的CGI包裝工作),這可以使用'ignore_user_abort()'來禁用。但是它似乎不會殺死'exec(...)'進程。 – dronus

+0

'exec(..)'不會被終止的原因可能是kill只會在對輸出管道破壞的寫操作中完成。因此,用戶中止不會觸發kill,除非'exec'進程正在生成輸出。 – dronus

0

在網頁中使用exec來進行午餐過程並保留返回的pid。

$pid = exec($command); 

在UI檢查後,如果過程結束,如果需要,允許用戶與像殺的過程:由於它是由阿帕奇開始

exec("kill -9 $pid"); 

,阿帕奇應該能夠殺死它。 我看到ajax調用某種REST API,並且應該注意不要讓用戶更多地幹掉他們開始的進程。