关于 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中执行?
坐等各位大侠,我也仔细研究中。
推荐文章: