关于 Laravel 的 Queue 的问题

申明,本人PHP多年,但是对laravel还是个新手。

最近在研究 Laravel,对 Queue 很感兴趣。于是想研究一下。

环境,macpro,php5.5.20,queue driver 使用的redis。

在执行 php artisan make:command SendEmail --queued 生成 queue 命令的时候,在 app/Commands/ 目录下会生成一个 SendEmail.php 文件。

我在Controller里面生产一个queue。

    Queue::push(new SendEmail("This is test message"));

在SendEmail.php的handle方法这样写的。

    sleep(4);
    file_put_contents("./storage/logs/sendMail.log", $msg."\t".date("Y-m-d H:i:s"), FILE_APPEND);
    $this->delete();

大致的意思是模拟异步queue执行的时间,同时记录到日志里面。

在执行Controller的时候发现,报错。
App\Commands\Command 没有找到。
去这个目录下看,的确不存在。

我修改为

    use Illuminate\Console\Command;

这回不报错了。Controller也可以执行了,SendEmail的方法也执行了,日志也生成。但是问题是,居然不是加到队列里面异步执行的,而是在页面中执行的,也就是说我页面执行时间是4秒。这和queue严重违背啊。
php artisan queue:listen
也没有反应。

laravel的官方资料也没有明确说明。laravel-china也一样。不知道各位有没有遇到这样的问题。

一开始我怀疑是redis的问题。但是我后来在controller里面写了一个测试redis的方法,是没有问题的。用phpredisadmin也能够看到缓存的值。

总结来说两个问题:

  • 1、为啥make command生成的代码没有App\Commands\Command ,但是却被use。
  • 2、为啥Queue::push的任务,还在页面中执行,而不是在queue的work中执行?

坐等各位大侠,我也仔细研究中。

superwen
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
sushengbuhuo

config/queue.php default不会是sync吧,看看env配置 QUEUE_DRIVER

6年前 评论

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