如何终止 Apache 网络服务器调用的后端 PHP 脚本?

如何终止 Apache 网络服务器调用的后端 PHP 脚本?

我在 Apache Web 服务器上调用一些 PHP 后端脚本,这些脚本被编程为运行几天。问题是我无法找到停止这些脚本的方法(除了使用 sudo apachectl restart 重新启动服务器)。

通常我会运行ps -aux | grep script_name获取 PID 并将其终止。

但是在这种情况下,当我使用 PHP 执行此操作时(shell_exec("ps -aux | grep script_name")我看不到该过程..我的假设是,当通过 apache 调用脚本时,它会在内部运行它们,因此它们是不可见的。

有什么想法可以检查哪些脚本正在运行并在需要时中止这些脚本?

答案1

好的,从我从您的评论中获得的信息来看,我认为您正在使用mod_phpapache 模块来包含 php 脚本。这也解释了为什么您必须重新启动 apache,这将终止包括 php 运行程序在内的所有线程。

由于 php 在您的 apache 中作为线程运行,因此您将无法使用 kill 或类似命令,因为 php 解析器根本没有分叉或不是一个单独的进程。

最干净的解决方案(从我的角度来看)是定期检查是否设置了标志。我假设您的脚本执行了一些计算繁重的操作,从而导致延迟。您可以将计算工作分成较小的块。如果是与 IO 相关的东西导致了延迟,您可能需要将其拆分或设置超时。

然后,您定期检查是否已设置某个标志(可以是数据库设置、生成的文件夹等)。如果是,则用户请求中止,您甚至可以正常停止计算。

现在您需要做的就是定义一个设置标志的附加脚本。主工作进程终止后,不要忘记删除该标志,一切又恢复正常。

答案2

在 Web 请求中运行需要花费时间的事情是完全错误的——即使在 2020 年有了 http/2 也是如此。

可以从命令行(提示 mod_status)实现识别和终止相关进程的结果,但这是 XY 问题。

看 -https://stackoverflow.com/questions/2212635/best-way-to-manage-long-running-php-script

相关内容