从零开始摸索,走的是错误的顺序,应该是先进行第4、5步
1.创建继承自shouldqueue的job
[root@bogon Education]# php artisan make:job Myqueue
Job created successfully.
2.编写分发执行函数
app\Jobs\Myqueue.php中hanle函数就是队列中执行的函数,Myquue本身还是一个class,有自己的构造函数
use Log;
public function handle()
{
Log::info("handle before sleep");
sleep(5);
Log::info("handle sleep done");
}
3.编写执行分发函数的控制器
routes\api.php
加上Route::post('/test2/{name?}', 'TestController@testqueue');
app\Http\Controllers\TestController.php中实现testqueue函数
use Log;
public function testqueue(){
echo "test queue begin";
Log::info("test queue begin");
$this->dispatch(new Myqueue());
Log::info("test queue dispatch done");
}
发起test2请求后,过了5秒钟才返回,证明根本就没有发生异步的队列分发
4.应该提前进行的配置
vim .env
QUEUE_CONNECTION=sync
改为
QUEUE_CONNECTION=redis
再次请求,错误500
"file": "/data/HQ/SC_Educations/hq_htdocs/Education/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PredisConnector.php",
需要安装predis,跟php-redis不是一个东西
composer require predis/predis
过程有点久
5.应该提前开启的队列检测
php artisan queue:work
或者
php artisan queue:listen
没开启的话,会立即返回,队列任务并不执行,开启后,以前执行失败的队列任务会立即执行,执行完之后才会接收新的队列请求
小贴士:
发起请求接收不到,要看nginx配置监听的ip、hostname,因为本示例的nginx监听的127.0.0.1,所以只能本机测试,不能用其他机器访问
laravel的接口访问一般放在routes\api.php,默认api开头,可以在app\Providers\RouteServiceProvider.php中修改前缀
protected function mapApiRoutes()
{
Route::prefix('biz_test/com')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
这样就可以用/biz_test/com/开头替代api开头了
laravel队列