Laravel框架中队列和工作(Queues、Jobs)操作实例详解(2)
在connections中,我们看到sync这个连接。sync是Laravel默认的队列,代表的就是synchronous,即同步队列。
今天我们要来看一下,如何使用database,即数据库来实现异步任务处理。
要使用database来作为队列的内部实现机制,我们需要建立一张用于储存Jobs的表:
$ php artisan queue:table $ php artisan migrate
以上命令将会在数据库创建名为jobs的表。
队列我们有了,那么现在我们来看一下Jobs。Laravel中jobs文件默认位置在app/Jobs文件夹下,我们可以通过make:job这个Artisan命令快速创建我们的job类:
$ php artisan make:job SendEmail
生成的job会实现Illuminate\Contracts\Queue\ShouldQueue这个接口,表明生成的job对象将被推到队列中进行异步处理。
job类其实很简单,里面只有一个名为handle的方法,该方法在job被queue处理的时候自动被调用。
在上面的命令中,我们创建了一个名为SendEmail的类:
<?php namespace App\Jobs; use App\Email; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class SendEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $email; /** * Create a new job instance. * * @param Podcast $podcast * @return void */ public function __construct(Email $email) { $this->email = $email; } /** * Execute the job. * * @param AudioProcessor $processor * @return void */ public function handle() { // Process email and send the email to recipient(s) // 这里我们可以处理我们的邮件并将邮件发送至接收人 } }
可以看到,我们可以将model传递进job的constructor中。Laravel会自动序列化(Serialize)模型的识别信息,在job真正被处理的时候,完整的模型数据才会被从数据库调用出来。另外,在handle方法中,我们也可以注入我们的依赖dependencies。
好了,现在我们有了job类,可以创建job对象了,那么如何把job添加进队列呢?
在我们的控制器中,我们可以调用job的dispatch方法来将其添加进队列中:
<?php namespace App\Http\Controllers; use App\Jobs\SendEmail; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Email; class EmailsController extends Controller { /** * Store a new email. * * @param Request $request * @return Response */ public function send(Request $request) { // Create email... // 这里我们提取email信息并创建$email, Email是我们自定义的Model $email = Email::create($request->only('sender', 'to', 'content')); SendEmail::dispatch($email); } }
内容版权声明:除非注明,否则皆为本站原创文章。