2015-05-05 23 views
11

为了处理大量的作业,我根据完成的工作量来运行可变数量的队列工作器。我不想让更多的工作人员完成需要在我们认为合适的时间段内完成的工作。Laravel Artisan CLI安全地停止守护进程队列工作人员

目前,我为测试目的启动了5个守护进程队列工作者,但是在生产中,这个数字可能在100个工人之间,可能更多。我知道在部署时,我必须首先通过使用php artisan down将框架置于维护模式来停止队列工作人员,因为​​标志会导致框架仅在工作人员启动时加载,因此新代码在部署直到工人重新启动。

如果由于某种原因需要停止工作,我可以使用php artisan down将应用程序置于维护模式,这将导致工作人员在完成当前工作(如果他们正在工作)完成后死亡。但是,有些时候我想杀死工作人员而没有将整个应用程序置于维护模式。

有没有一种安全的方式来阻止工作人员继续处理他们当前的工作,然后死亡,而无需将整个应用程序置于维护模式?

基本上我需要的是一个php artisan queue:stop,其行为类似于php artisan queue:restart,但一旦任务完成不重新启动工人。

我期待有一个像php artisan queue:stop命令那样做,但似乎并非如此。

使用ps aux | grep php我能够获取工作人员的进程ID,并且我可以用这种方式杀死进程,但我不希望在进行工作时杀死进程。

谢谢。

+2

对于任何发现此问题的人。 http://stackoverflow.com/questions/30060526/laravel-artisan-cli-safely-stop-daemon-queue-workers#comment48332831_30087630有答案。 PHP的工匠队列:重启将停止工人。 “重新启动”的名称是误导性的。工人停止后实际上不会重新启动。 – Vigs

+0

是正确的。“重新启动”只有当你有类似Supervisor设置才能监控并在他们退出时自动重启它们时才会发生。 (这是典型的设置。) –

回答

2

我们在我们的应用程序中实现了类似的东西 - 但它并不是内置于Laravel本身的东西。您必须编辑this file,在if块中添加另一个条件,以便它将调用stop函数。您可以通过在Worker类中设置一个静态变量来实现这一点,每当您运行必须制作的自定义命令时(例如php artisan queue:pause)或通过检查某处的原子值(即将其设置在某个缓存中,例如redis ,memcached,APC甚至MySQL,尽管这将意味着您将使用相同的自定义命令设置您为这个while循环的每个循环都有一个MySQL查询。

+0

是的,我害怕我将不得不做这样的事情。必须进行redis或memcache设置,检查标志对于查询是一种浪费,特别是当它发生在循环中的每次迭代中时,有25-100名工作人员。最佳答案我已经有了,所以+。希望他们在以后的版本中添加这样的内容。 – Vigs

+0

是的,APC/redis/memcached将是最佳选择,在这种情况下,APC是最好的选择。 – Nikko

2

使用​​标志时,如果队列为空,标志员工不应该退出。

我想你正在寻找的是in the documentation for queues.

php artisan queue:restart命令将促使工人重新启动他们做了他们目前的工作后。

+1

正确,我不希望工作人员在队列为空时停下来。我期望做的是停止排队工人的命令,但要“安全”地执行,以便他们不会在处理工作中止。 'php artisan queue:restart',不幸的是没有做我需要做的事情。我不想重新启动工人,我期待着“安全地”阻止他们。该文档不包含有关停止队列工作人员的任何信息,仅仅提到您可能必须“手动”执行此操作。 – Vigs

+0

基本上我需要的是一个'php工匠队列:stop',其行为像'php artisan queue:restart',但是一旦工作完成就不会重新启动worker。 – Vigs

+7

用'php artisan queue:work --daemon'打开一个终端并在另一个终端运行'php artisan queue:restart'。第一个终端实际上​​会在一段时间后关闭。它并没有真正重启它,直到像http://supervisord.org/这样的独立进程才能处理。 – Deinumite