非同步資料庫隊列(Async Database Queue)
在我們使用 Laravel 提供的資料庫隊列(Database Queue)時,我們需要在命令列執行 php artisan queue:listen
指令,持續的去監聽是否有需要執行的 Queue。
barryvdh/laravel-async-queue 隊列套件,可以讓我們不用持續的監聽隊列資料,並在使用隊列時,立即的使用 shell 在背景執行隊列的工作。
目前(2015-06-01) 套件 0.4.x 版本有支援 Laravel 5
安裝
$ composer require 'barryvdh/laravel-async-queue:0.4.*@dev'
加入 Service Provider
在 config/app.php
檔案中加入 'Barryvdh\Queue\AsyncServiceProvider'
// config/app.php
return [
'providers' => [
'Barryvdh\Queue\AsyncServiceProvider',
]
];
產生隊列資料表
barryvdh/laravel-async-queue 隊列套件使用原生的資料庫隊列資料表(Database Queue)去時做的,所以我們可以使用 php artisan queue:table
指令去產生隊列的 Migration
$ php artisan queue:table
所以執行命令後,你可以找到像是 database/migrations/2015_05_26_225627_create_queue_jobs_table.php
這樣的隊列 Migration 檔案
Migration 檔名日期
2015_05_26_225627
每個人皆不同,會依照你建立當時的時間去產生
產生的隊列 Migration 會長的像這樣:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateQueueJobsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('jobs', function(Blueprint $table)
{
$table->bigIncrements('id');
$table->string('queue');
$table->text('payload');
$table->tinyInteger('attempts')->unsigned();
$table->tinyInteger('reserved')->unsigned();
$table->unsignedInteger('reserved_at')->nullable();
$table->unsignedInteger('available_at');
$table->unsignedInteger('created_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('jobs');
}
}
建立隊列資料表
執行 php artisan migrate
將隊列資料表新增至資料庫
設定隊列驅動
在 config/queue.php
檔案中設定非同步資料庫隊列(Async Database Queue)驅動設定,設定如下:
// config/queue.php
return [
'default' => 'async',
'connections' => [
'async' => [
'driver' => 'async',
'table' => 'jobs',
'queue' => 'default',
'expire' => 60,
'connection_name'=>'',
],
],
];
建立隊列工作
我們可以使用 \Queue::push('App\Commands\SendEmail@fire', $queue_data);
的方法去新增要執行的隊列
第一個參數是執行隊列需要呼叫的類別名稱位置(App\Commands\SendEmail
)及方法(fire
)
類別名稱需要正確的指定類別的命名空間(namespace),可以指定這個隊列要執行的類別方法,只要將方法使用 @
加在後方即可(@customMethod
)
若沒有指定用哪個方法,Laravel 預設會執行 fire
的類別方法(@fire
)
我們使用隊列來寄送 Email,設定隊列的方式大概像這樣:
// 需要傳送給隊列處理的資料
$queue_data = [
'email' => 'kejyun@gmail.com',
'name' => 'KeJyun',
];
// 建立隊列
$queue_id = \Queue::push('App\Commands\SendEmail@fire', $queue_data);
在 App\Commands\Sendmail.php
檔案大概會像這樣:
<?php namespace App\Commands;
class SendEmail {
/**
* 執行隊列
*
* @return void
*/
public function fire($job, $data)
{
// 寄送 Email
\Mail::send('emails.welcome', [], function($message) use ($data)
{
$message->to($data['email'], $data['name'])->subject('歡迎使用 Laravel 5 資料庫隊列寄送 Email!!!');
});
}
}
這樣我們就可以正常的使用隊列去幫我們寄信摟!!
目前(2015-06-01) barryvdh/laravel-async-queue 在執行完隊列時,無法直接刪除隊列資料,待作者修復這個 bug
參考資料
- 隊列 - Laravel.tw
- Queues in Laravel with Redis
- barryvdh/laravel-async-queue - packagist
- Laravel 5 Async Queue Driver - Github
KeJyun 最新新書推薦
|
|
---|---|
Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。 雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。 本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。 |
|
購書連結 |
|
購書連結 |