【问题标题】:Close previous PHP CLI process in background process were opened by laravel artisan关闭之前后台进程中的 PHP CLI 进程由 laravel artisan 打开
【发布时间】:2026-01-02 04:35:01
【问题描述】:

在我们的一个 windows 环境下的 laravel 项目中,我们需要一个队列监听器。因此,一开始我们在命令提示符下传递了以下命令,并且该窗口保持打开状态。

C:\Apache24\htdocs\laravel\artisan queue:listen --timeout=240

但这不是一个好的举动,因为如果有人错误地关闭或在系统更新后它可能会关闭。所以我们用调度器计划了后台进程。

我们在系统启动期间和每 1 小时运行一个批处理文件。该批处理具有以下命令。

start /MIN /B php C:\Apache24\htdocs\laravel\artisan queue:listen --timeout=240

但是几天后,我们探索了任务管理器,我们注意到有许多 PHP CLI 在后台进程中运行,导致 100% 的进程被使用。系统变慢了。所以我们另外添加了命令来杀死已经运行的 PHP CLI。批处理文件类似于下面给出的命令。

taskkill /f /fi "imagename eq php.exe"
start /MIN /B php C:\Apache24\htdocs\laravel\artisan queue:listen --timeout=240

现在我们需要以 1 分钟的间隔运行另一个后台进程。如果它每分钟运行一次,则将启动新的 PHP CLI 后台进程。如果我们杀死所有过去的 PHP CLI 后台进程,它将杀死已经为 artisan queue 运行的 PHP CLI。

因此对于这种依赖关系,解决此问题的最佳方法是什么。

我们的主要目标是不运行任何消耗更多内存的孤立 PHP CLI 后台进程。

【问题讨论】:

    标签: php windows laravel laravel-5.4 taskscheduler


    【解决方案1】:

    我在这里看到最后两个选项:

    1. 使用您的 PHP 进程检查是否已经有另一个正在运行。如果是 - 只是长信息和保释。如果不是 - 继续执行。这样,您可以让调度程序尝试像每分钟左右那样启动进程。如果前一个进程死亡,它将在一分钟内重新启动。

    2. 使用某种进程管理器。我为 Windows 找到了类似的东西:winss。假设它的工作方式类似于S6。它将确保只有一个实例在运行,并在它死亡时自动重新启动它。另一个主管是 supervisord - 它可以通过 Cygwin 运行。看看这个 SO 答案:Is there Windows analog to supervisord?

    【讨论】: