php在取消时停止shell执行

php在取消时停止shell执行,php,exec,Php,Exec,当我通过按下浏览器的“停止”按钮来取消PHP脚本时,exec(…)运行的外部二进制文件似乎没有停止。如果服务器配置为每个用户不处理一个以上的脚本,则会禁用任何用户活动,直到运行的命令完成。我怎么能告诉PHP在取消时终止已执行的进程呢?简而言之,有点困难 您的浏览器对服务器说“执行此页面”,然后服务器用运行脚本时返回的内容进行回复。如果客户端离开,服务器通常仍会完成脚本,而与浏览器是否侦听无关 我能想到的唯一方法是,如果服务器是UNIX,您可以做一些事情来尝试计算运行命令的PID,如果您阅读了这篇

当我通过按下浏览器的“停止”按钮来取消PHP脚本时,
exec(…)
运行的外部二进制文件似乎没有停止。如果服务器配置为每个用户不处理一个以上的脚本,则会禁用任何用户活动,直到运行的命令完成。我怎么能告诉PHP在取消时终止已执行的进程呢?

简而言之,有点困难


您的浏览器对服务器说“执行此页面”,然后服务器用运行脚本时返回的内容进行回复。如果客户端离开,服务器通常仍会完成脚本,而与浏览器是否侦听无关

我能想到的唯一方法是,如果服务器是UNIX,您可以做一些事情来尝试计算运行命令的PID,如果您阅读了这篇文章,您可以设置在断开连接时发生的事情。接下来,您可以让一个PID运行另一个命令来终止该命令


但是,我不想保证结果。

在网页中使用exec到午餐流程并保留返回的pid

$pid = exec($command);
稍后在UI中检查流程是否已结束,如果需要,允许用户使用以下命令终止流程:

exec("kill -9 $pid");
由于它是由Apache启动的,Apache应该能够杀死它。 我看到ajax调用某种restapi,您应该注意不要让用户杀死比他们启动的进程更多的进程

 $command = 'your command' . ' > /dev/null 2>&1 & echo $!'; 
 exec($command, $output);
 echo $pid = (int)$output[0];
然后当你想杀死它时:

 exec("kill -9 $pid");

检查这个问题:“如果客户端离开,服务器通常仍然完成脚本”似乎是错误的。如果用户关闭连接(我认为至少可以使用CGI包装),PHP可以取消执行,可以使用
ignore\u user\u abort()
禁用。但是,它似乎没有终止
exec(…)
进程。没有终止暂停
exec(…)
的原因可能是,终止仅在写入损坏的输出管道时进行。因此,除非
exec
'd进程正在生成输出,否则用户中止不会触发终止。exec不会返回pid,据我所知,$命令可能类似于“pidof…”,或者找到某种方法来标识“外部二进制文件”的pid。如果你给出确切的例子,我会给出确切的代码。PID必须在输出中。我从来并没有说过exec会在exec中返回命令的PID,但我想我对此并不清楚。