2011-09-29 71 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,并且应该注意不要让用户更多地干掉他们开始的进程。