Laravel 5.1在不重启虚拟机的情况下无法看到Job文件的更改

22

我在运行在Homestead VM的Laravel 5.1应用程序中创建了一个新作业,将其设置为排队,并在handle方法中编写了代码。

handle()方法之前需要传递参数,但现在不再需要,并且我已经从handle方法中删除了参数。

然而,当队列运行作业时,我会收到一个错误,内容如下:

[2015-06-17 14:08:46] local.ERROR: exception 'ErrorException' with message 'Missing argument 1 for Simile\Jobs\SpecialJob::handle()' in /home/vagrant/Code/BitBucket/simile-app/app/Jobs/SpecialJob.php:31

该文件的第31行是:

public function handle()

现在不再需要任何参数,除非有一个未记录的默认参数。

现在我所做的任何更改,包括注释掉作业文件中的所有内容,都不会在运行队列时被看到。我仍然会得到相同的错误。

我尝试重新启动nginxphp5-fpmsupervisorbeanstalkd,并运行:artisan cache:clearartisan clear-compiledartisan optimizecomposer dumpautoload

什么都没有用。

唯一让laravel看到作业文件更新的方法是重新启动虚拟机。vagrant halt,然后vagrant up

该作业是像这样在控制台命令中触发的:

$this->dispatch(new SpecialJob($site->id));

这是SpecialJob.php文件的全部代码:

http://laravel.io/bin/qQQ3M#5

我尝试创建了另一个新的Job并进行了测试,结果相同。

所有其他非Job文件都会立即更新,没有问题。只有Job文件出现了问题。就像旧版本被缓存到了我找不到的某个地方。


你在队列工作进程上使用了 --daemon 标志吗? - ceejayoz
@ceejayoz 是的,我是。 - Nicekiwi
1
你是否按照守护进程文档中指示的方式运行了 php artisan queue:restart 命令? - ceejayoz
@ceejayoz,看到了,但我认为重新启动supervisor应该可以解决这个问题。D:当我运行那个命令时它更新了!!:O - Nicekiwi
1
耶!很高兴那个起了作用。 - ceejayoz
1个回答

61
在运行队列工作器作为守护进程时,你必须告诉工作器在代码更改后重新启动。

Since daemon queue workers are long-lived processes, they will not pick up changes in your code without being restarted. So, the simplest way to deploy an application using daemon queue workers is to restart the workers during your deployment script. You may gracefully restart all of the workers by including the following command in your deployment script:

php artisan queue:restart

3
谢谢。我为此已经苦思冥想了两天,哈哈! :P寓意是:永远不要假设。 - Nicekiwi
天啊,我也遇到了这个奇怪的问题,看到你的答案真是太高兴了。https://dev59.com/WV4b5IYBdhLWcg3w1UzL#arKiEYcBWogLw_1bGxnK 对我也有帮助。而且这个看起来很有趣:https://dev59.com/14_ea4cB1Zd3GeqPQJNZ#32851454。 - Ryan
1
在运行了queue:work命令之后,它对我没有起作用。旧代码仍然被应用。请帮帮我。 - Ngan Nguyen
1
@NganNguyen 你可能需要重新启动你的虚拟机。 - MrChux
重启了supervisord,然后它就正常工作了。-.- - saber tabatabaee yazdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接