根据官方文档,所有自己编写的 任务类 需继承抽象类 app/Jobs/Job.php
,内容如下:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\{InteractsWithQueue, SerializesModels};
abstract class Job implements ShouldQueue {
use InteractsWithQueue, Queueable, SerializesModels;
}
实际编写中我们会发现,push
和 later
方法的第一(later
是第二)个参数允许的类型是 string|object
而在 push
中的第一个参数我们传入 object
时,其第二个 $data
参数并不能被任务类所接收及使用,所以该参数传与不传没有任何影响
这里我们可以通过构造函数设置形参接收自定义数据,这是 方式一:
方式一
任务类
新建或是直接使用框架默认的 ExampleJob.php
进行改造,内容如下:
<?php
namespace App\Jobs;
class ExampleJob extends Job {
/** @var mixed */
private $data;
public function __construct($data) {
$this->data = $data;
}
public function handle() {
// 使用 $this->data 得到自定义数据
print_r($this->data);
echo "任务完成\n";
$this->delete();
}
}
发布任务
push
创建即时任务,later
创建延时任务
use App\Jobs\ExampleJob;
use Illuminate\Support\Facades\Queue;
Queue::push(new ExampleJob(['a' => 123]), null, 'QueueName');
Queue::later(10, new ExampleJob(['a' => 123]), null, 'QueueName'); // 10 秒后执行
执行/消费任务
项目根目录下戳开命令行:php artisan queue:work --once --queue QueueName
不出意外会返回如下内容:
[2019-04-15 13:09:32][4sn1YRaaxmugPNipBIgUBYiNbQxEEyD0] Processing: App\Jobs\ExampleJob
Array
(
[a] => 123
)
任务完成
[2019-04-15 13:09:32][4sn1YRaaxmugPNipBIgUBYiNbQxEEyD0] Processed: App\Jobs\ExampleJob
如上是方式一的使用。
方式二
既然官方都给出了 $data
参数,那一定是有作用的。
根据源码得知,当第一个参数(以 push
为例)传入类型为 object
时,$data
参数并不会使用
而当传入类型为 string
时,$data
就会用到了,具体操作往下看↓↓↓
编写任务类
前提
如果采用这个方式编写任务类,得先改造 Job.php
:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\{InteractsWithQueue, SerializesModels};
use Illuminate\Queue\Jobs\{Job as BaseJob, JobName};
abstract class Job implements ShouldQueue {
/*
|--------------------------------------------------------------------------
| Queueable Jobs
|--------------------------------------------------------------------------
|
| This job base class provides a central location to place any logic that
| is shared across all of your jobs. The trait included with the class
| provides access to the "queueOn" and "delay" queue helper methods.
|
*/
use InteractsWithQueue, Queueable, SerializesModels;
/** @var BaseJob */
protected $job;
/** @var mixed */
protected $data;
/**
* @param BaseJob $job
* @param mixed $data
*/
public function fire(BaseJob $job, $data = null) {
$payload = $job->payload();
$class = JobName::resolve($payload['job'], $payload);
$jobClass = new $class();
$jobClass->job = $job;
$jobClass->data = $data;
$jobClass->handle();
}
}
然后还是就着默认的 ExampleJob.php
继续改造:
<?php
namespace App\Jobs;
class ExampleJob extends Job {
/**
* 构造函数形参必须留空或不写
*/
//public function __construct() {
//
//}
/**
* 执行任务
*/
public function handle() {
print_r($this->data);
echo "任务完成\n";
$this->delete();
}
}
发布任务
和方式一不同点就是用上了 $data
参数
// push 方法第二个参数可传入对象、数组、字符串等类型
Queue::push(ExampleJob::class, ['b' => 321], 'QueueName');
Queue::later(10, ExampleJob::class, ['b' => 321], 'QueueName');
执行/消费任务
项目根目录下戳开命令行:php artisan queue:work --once --queue QueueName
返回结果:
[2019-04-15 14:14:42][ap45P4BRqafc47ESugdqWUm5gbowr4Zc] Processing: App\Jobs\ExampleJob
Array
(
[b] => 321
)
任务完成
[2019-04-15 14:14:42][ap45P4BRqafc47ESugdqWUm5gbowr4Zc] Processed: App\Jobs\ExampleJob