百度百科是這樣說的javascript
「隊列」是在傳輸過程當中保存數據的容器。php
舉幾個生活中例子: * iphone手機新款發佈,三里屯iphone進的新貨。你們要排隊買,不能說一大堆人一塊兒衝進去,那麼這店就完了。 * 你有一大堆女友。你不得一個一個來,一塊兒來你也受不了 ? * C語言中堆的概念也是這樣,先進先出,不能起個大早趕個晚集。html
回到正題:java
消息隊列則是爲大批量處理數據而準備的一個概念,他有不少實現方式,並非單一的代碼結構。laravel
這裏有比較專業的一篇文章: http://www.cnblogs.com/xuyatao/p/6864109.html數據庫
還有適合新手揣摩的教程: http://www.imooc.com/learn/852數組
廢話說完了,完全進入正題:iphone
Laravel 爲咱們提供了一個簡單並很容易配置的隊列類.異步
引用一點官方翻譯的話:函數
Laravel 隊列爲不一樣的後臺隊列服務提供統一的 API , 例如 Beanstalk,Amazon SQS, Redis,甚至其餘基於關係型數據庫的隊列。 隊列的目的是將耗時的任務延時處理,好比發送郵件,從而大幅度縮短Web請求和相應的時間。 隊列配置文件存放在 config/queue.php。 每一種隊列驅動的配置均可以在該文件中找到, 包括數據庫, Beanstalkd, Amazon SQS, Redis, 以及同步(本地使用)驅動。 其中還包含了一個null隊列驅動用於那些放棄隊列的任務。
Laravel 在 5.4版本中直接提供了全局函數 dispatch(),你能夠再任意地方調用。而且無需加載任何對象或者實例化類。 這個函數主要的用途就是將你的隊列需求加入到指定的容器中(專業點的叫生產者,其實你大可理解爲你在商城購物完排隊結帳的時候)
Laravel神奇數據庫遷移我就很少說了。我相信你知道。
php artisan queue:table
php artisan migrate
執行完上面兩條命令,費力打開 config\queue.php, key=default 的數組中使用env配置文件加載方式,laravel安裝後默認爲sync(同步),咱們須要改成異步(你如今能夠暫時認爲同步!=隊列),這裏咱們選擇使用關係型數據庫來實現隊列
QUEUE_DRIVER=database
建立任務 = 搞一個生產者 = (其實就是寫一個在隊列中你想執行的業務邏輯),名字隨意取,但最好遵照命名規範
php artisan make:job SendReminderEmail
這個生成的文件大概分2部分:__construct() 構造方法 , handle 隊列執行方法(意思就是在隊列執行的時候,就用你這裏面寫的代碼)
class SendReminderEmail implements ShouldQueue { // 這塊你不用搭理他 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $name; /** * Create a new job instance. * * @return void */ public function __construct($name) { $this->name = $name; } /** * Execute the job. * * @return void */ public function handle() { DB::table('email')->insert([ 'name' => $this->name, 'img'=>1, 'sort'=>1 ]); } }
隨後在控制器內使用dispatch方法調用便可,下面我則for循環建立了100個業務
public function index(Request $request) { for ($i = 0; $i <= 100; $i++) { dispatch(new SendReminderEmail("email" . $i)); } }
你經過數據遷移的數據表中就基本成這樣了
消費者 = 隊列處理 = (你在商城購物已經開始付錢了),使用下面命令則你開始消費,隊列也會按照你上面的業務邏輯開始處理。處理完畢後當前任務會自動刪除。
php artisan queue:work
基本就下面這個樣
到此Laravel5.4 隊列簡單配置與使用就結束了。
更多專業吊炸天的教程請參考China Laravel http://d.laravel-china.org/docs/5.4/queues