关于 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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5
sushengbuhuo

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

6年前 评论

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