队列处理器一直执行?

按照课程上来的,注册好事件并且在控制器中触发,提交评价。
然后突然发现这样

清空缓存无法解决
重启无法解决
git 退回上一版本后 还是一直执行

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
leo
最佳答案

学会看报错,这个错误和 items() 一点关系都没有, 而是因为 $event->getOrder() 返回了 null,自己仔细检查相关的代码吧

5年前 评论
讨论数量: 9
leo

说明报错了,看 Laravel 日志

5年前 评论

@leo

用 git 回滚到上个版本后,
执行 php artisan queue:work 还是一直 Processing: App\Listeners\UpdateProductRating
回滚之后已经没有这个文件了啊,也清空缓存了

另外,老师我不清楚在命令行怎么 看 Laravel 日志,能讲一下吗,谢谢

5年前 评论
leo

@andy_ww 回滚代码不会影响已经进入队列的任务的执行。

日志在 storage/logs/laravel-{当前日期}.log

5年前 评论

@leo

Call to a member function items() on null

错误信息显示是 $items = $event->getOrder()->items()->with(['product'])->get();
这行代码

我在 Order 模型文件里已经设置 items() hasMany 了

附上日志里的报错信息

[2019-01-09 07:50:22] local.ERROR: Call to a member function items() on null {"exception":"[object] (Symfony\Component\Debug\Exception\FatalThrowableError(code: 0): Call to a member function items() on null at /home/vagrant/code/laravel-shop/app/Listeners/UpdateProductRating.php:17)
[stacktrace]

0 [internal function]: App\Listeners\UpdateProductRating->handle(Object(App\Events\OrderReviewed))

1 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php(86): call_user_func_array(Array, Array)

2 [internal function]: Illuminate\Events\CallQueuedListener->handle(Object(Illuminate\Foundation\Application))

3 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)

4 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()

5 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))

6 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/Container.php(549): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)

7 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate\Container\Container->call(Array)

8 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(114): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Illuminate\Events\CallQueuedListener))

9 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Events\CallQueuedListener))

10 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then(Object(Closure))

11 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(49): Illuminate\Bus\Dispatcher->dispatchNow(Object(Illuminate\Events\CallQueuedListener), false)

12 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(76): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)

13 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(320): Illuminate\Queue\Jobs\Job->fire()

14 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(270): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))

15 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(114): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))

16 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(101): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions))

17 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(85): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')

18 [internal function]: Illuminate\Queue\Console\WorkCommand->handle()

19 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)

20 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()

21 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))

22 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Container/Container.php(549): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)

23 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Console/Command.php(183): Illuminate\Container\Container->call(Array)

24 /home/vagrant/code/laravel-shop/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))

25 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Console/Command.php(170): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))

26 /home/vagrant/code/laravel-shop/vendor/symfony/console/Application.php(946): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

27 /home/vagrant/code/laravel-shop/vendor/symfony/console/Application.php(248): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

28 /home/vagrant/code/laravel-shop/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

29 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Console/Application.php(88): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

30 /home/vagrant/code/laravel-shop/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(121): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

31 /home/vagrant/code/laravel-shop/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

32 {main}

"}

5年前 评论
leo

学会看报错,这个错误和 items() 一点关系都没有, 而是因为 $event->getOrder() 返回了 null,自己仔细检查相关的代码吧

5年前 评论

@leo

[2019-01-09 10:04:56] Processed: App\Listeners\UpdateProductRating

老师,我在执行队列处理器之后执行成功过一次,成功之后这个监听器一直自动触发。
执行成功之后不是应该停止了吗,为啥他自己一直自动触发?
我为了避免写错,全是复制您的代码;

5年前 评论
leo

@andy_ww 可能事件被触发了多次,第一次的监听器处理成功了,后面的事件处理失败了。

5年前 评论
leo

另外我看你这控制台输出像是 Laravel 5.5 的项目,而你这个提问是在 5.7 下的,你得确认一下不要看错版本

5年前 评论

遇到同样问题, 可能是因为之前的错误卡住了队列. 请先查看日志, 确认代码无误, 然后注释掉UpdateProductRating的handle内部代码, 启动队列 php artisan queue:work. 如果不再报错, 再解开UpdateProductRating的注释, 重启队列应该就可以了.

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!