駐列的目的是希望在幕後執行耗時的工作來加快反應時間,對於不熟悉駐列的人,Laracast一開始提供小例子練習:假設 Log裡面出現hello, world! 是耗時的工作,所以我們不希望同步執行這個工作。
Route::get('/', function () {
logger('hello, world!');
return 'Finished';
});
Laravel提供多種的駐列給開發者使用,像Redis等等,最簡單的就是使用database,所以這裡用database示範。
(1)用database做出駐列
php artisan queue:table
與php artisan migrate
去做出駐列。(2) 將首頁的路由邏輯改為下列,進到首頁,則螢幕會出現Finished,但Log裡面沒有出現hello, world。
Route::get('/', function () {
dispatch(function(){logger('hello,world');});
return 'Finished';
});
(3) 觀察jobs資料表,會多出資料:
...
{\\logger('hello,world');}\";s:5:\"scope\";s:37:\"Illuminate\\Routing\\RouteFileRegistrar\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000517307660000000033b29227\";}}s:16:\"failureCallbacks\";a:0:
...
(4) 執行php artisan queue:work
,此時Log裡面出現hello, world,透過駐列的功能可以將耗時的工作存到駐列中後等待執行,加快使用者回應速度。
(5) 如果邏輯更複雜,使用Laravel提供的Job類別。
php artisan make:job LoggerJob
。
將操作邏輯加到handle方法中。
class LoggerJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
logger('hello,world ');
}
Route::get('/', function () {
dispatch(new LoggerJob());
return 'Finished';
});
...
:{"commandName":"App\\Jobs\\LoggerJob","command":"O:18:\"App\\Jobs\\LoggerJob\":10:{s:7:\"\u0000*\u0000user\";N;s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\" ...