在我们在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后台进程,这会消耗更多内存。
答案 0 :(得分:0)
我在这里看到最后两个选项:
使用PHP进程检查是否还有另一个正在运行。如果是 - 只需要很长时间的信息和保释。如果不是 - 继续执行。这样,您可以让调度程序尝试像每分钟左右一样启动该过程。如果前一个过程终止,它将在一分钟内重新启动。
使用某种流程主管。我为windows发现了类似的内容:winss。它的工作方式类似于S6。它将确保只有一个实例运行,并在它死亡时自动重启它。另一位主管是监督员 - 它可以通过Cygwin运行。看看这个SO答案:Is there Windows analog to supervisord?