注:这里以redis队列为例,其他都大同小异
队列配置文件是config/queue.php:
return [
'default' => env('QUEUE_DRIVER', 'sync'),
'connections' => [
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'expire' => 60,
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'expire' => 60,
'retry_after' => 90,
],
],
'failed' => [
'database' => 'mysql', 'table' => 'failed_jobs',
],
];
配置文件第一个配置项default用于指定默认的队列驱动,修改.env中的QUEUE_DRIVER即可。
connection对应config/database.php中redis的default配置;queue为默认队列名称;expire为队列任务过期时间(秒)。这里我们可以保持其默认配置不变。
配置文件 config/database.php 中配置 Redis 数据库连接
php artisan make:job Test
通常,所有的任务类都保存在 app/Jobs 目录
namespace App\Jobs;
use App\Extend\Logs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
class Test implements ShouldQueue
{
use Dispatchable;
use InteractsWithQueue;
use Queueable;
use SerializesModels;
/**
* 在超时之前任务可以运行的秒数.
*
* @var int
*/
public $timeout = 120;
/**
* 最大失败次数.
*
* @var int
*/
public $tries = 3;
private $status;
private $prize;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($status = 0, $prize = [])
{
$this->status = $status;
$this->prize = $prize;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
sleep(5);
Db::table('guild_data_log.test')->insert([
'status' => $this->status,
'remark' => '队列测试01',
'created_date' => date('Y-m-d H:i:s'),
'content' => json_encode($this->prize),
]);
}
}
哪里调用,加在哪里
use App\Jobs\Test;
//可以使用 OnConnection 和 OnQueue 方法。这些方法指定了应该使用的队列连接和队列名称
dispatch(new Test(1, ['text'=>1111]))->OnConnection('redis')->OnQueue('test');
或
Test::dispatch(99,['111'])->OnConnection('redis')->OnQueue('test');
php artisan queue:work redis --queue=test --tries=3
注: --tries指定任务可尝试的最大次数的
Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。在 Ubuntu 安装Supervisor 非常简单:
sudo apt-get install supervisor
其他的详细情况可以看我另一篇文章:Supervisor的安装配置和使用
1.创建文件夹和配置文件
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
2.修改/etc/supervisor/supervisord.conf文件内容
在文件结尾[include]节点处
把;files = relative/directory/*.ini
改为files = conf.d/*.conf
3.执行supervisorctl reload命令使配置文件生效。
4.在/etc/supervisor/下创建conf.d文件夹,及test.conf
[program:laravel-test]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /data/wwwroot/guild/artisan queue:work redis --queue=test --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
stopwaitsecs=3600
5.运行supervisord,查看是否生效,执行以下命令:
supervisord -c /etc/supervisor/supervisord.conf
查看任务状态
supervisorctl status
返回对应任务信息,表示运行成功!
6.注意每次修改任务代码都要重启队列才会生效
//重启命令
supervisorctl restart laravel-test:laravel-test_00
//全部重启
php artisan queue:restart
或
supervisorctl reload
7.常用命令
sudo service supervisor stop 停止supervisor服务
sudo service supervisor start 启动supervisor服务
supervisorctl shutdown #关闭所有任务
supervisorctl stop|start program_name #启动或停止服务
supervisorctl status #查看所有任务状态
#查看单个任务状态
supervisorctl status 服务名
#关闭任务
supervisorctl stop 服务名|all
#启动任务
supervisorctl start 服务名|all
#重启任务(不会重新加载有改动的配置)
supervisorctl restart 服务名|all
#更新新的配置到supervisord
supervisorctl update
#重新启动配置中的所有程序(会重新加载有改动的配置)
supervisorctl reload