定义作业
在 Laravel 中,定义作业是通过实现 IlluminateContractsQueueJob
接口来完成的。这个接口定义了一个 fire
方法,用于处理作业的逻辑。下面是一个示例::
// app/Jobs/ProcessPodcast.php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $podcast;
/**
* Create a new job instance.
*
* @param AppPodcast $podcast
* @return void
*/
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// Process the podcast...
}
}
代码语言:javascript复制// routes/web.php
use AppJobsProcessPodcast;
use AppPodcast;
Route::get('/', function () {
dispatch(new ProcessPodcast(Podcast::find(1)));
return 'Podcast processing started.';
});
代码语言:javascript复制// app/Providers/AppServiceProvider.php
namespace AppProviders;
use IlluminateSupportServiceProvider;
use IlluminateQueueEventsJobProcessed;
use IlluminateQueueEventsJobProcessing;
use IlluminateSupportFacadesLog;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
// Registering a listener for job processing
app('queue')->before(function (JobProcessing $event) {
Log::info('Processing job: '.$event->job->resolveName());
});
// Registering a listener for job processed
app('queue')->after(function (JobProcessed $event) {
Log::info('Processed job: '.$event->job->resolveName());
});
}
}
代码语言:javascript复制// .env
QUEUE_CONNECTION=redis
这些代码实现了一个简单的队列作业。当我们访问网站主页时,它会将一个处理播客的作业推送到队列中。我们还注册了两个队列事件监听器来记录作业何时开始处理和何时处理完成。我们将队列连接设置为Redis。
当我们运行作业时,可以在Laravel日志文件中查看两个事件的记录。我们可以使用以下命令查看日志文件:
代码语言:javascript复制php artisan log:tail
通过这些代码,我们可以更好地了解如何在Laravel中使用队列来执行后台作业。