概述
隊列概念:略,不知道的自行解決。(PS:此處laravel version:5.1)
在app服務端開發中,常常會遇到此種情況:
某一個大的任務中,可以分割為1,2,3,4個小任務,其中2的完成依賴1,4的完成依賴2。那麼1、2、4可以理解為一個事務,必須依次執行,否則任務無法完成。但是任務3,與1、2、4沒有關係,可以單獨完成,誰先誰後也沒有影響。具體說以下任務就跟三是一個屬性:訊息推送,郵件發送等等。
訊息佇列的理解
對於這塊,是屬於典型的生產者/消費者模型。一個生產者程式製造任務,放進隊列裡,然後消費者程式去檢查隊列,發現了任務,就消費它。理論上理解通透了。來看看實際操作。
laravel實現的訊息佇列
官方文檔:laravel的隊列
1. 實現生產者
通過訊息佇列的模型,我們知道應該有一個生產者,那麼在laravel中,該如何去構造這個生產者呢?很簡單。
php artisan make:command PushMessage ?queued
執行完後,可以在app目錄下看到 app\Commands\PushMessage.php ,開啟這個檔案,會看到它整合了一個 Command 這個類,但是呢,我們這裡並沒有這個類(如果你用的是5.0版本,那麼它是存在的,5.1就沒有啦)。不要緊張,自己在建立一個 app\Commands\Command.php 代碼內容如下:
OK!,然後再次回到 app\Commands\PushMessage.php 這個檔案,其中有一個方法 handle ,我們這裡為了示範,就使用寫檔案的操作來進行啦。在其中寫入以下內容
file_put_contents('D:/webApp/test.txt', 'hello world!'); 到這裡,生產者就寫完了,找個控制器。將這個生產者產生的內容推進隊列裡邊吧。我這裡示範,是自己在 app\Http\Controllers\TestController.php 中進行的調用。還是貼以下源碼吧:
這裡有兩個點,需要注意:
① 這裡我們使用的是Queue Facade,但是官方建議使用Bus Facade.兩者效果一樣,你自己權衡。
② 這裡我為了查看效果,特意加了一個60s後,執行隊列中的任務。
2. 隊列資料表儲存的地方
光生產出來不行的,還得有個地方把這些生產的產品儲存起來。這裡為了簡單,我就使用資料庫的方式吧。其他方式大家可以自己試試,都很容易。使用資料庫,需要進行以下配置:
開啟 config/queue.php,更改預設隊列驅動為資料庫:
default’ => env(‘QUEUE_DRIVER’, ‘database’)
配置好,你的資料庫連接服務。這個就不說了。通過config/app.php 來配置
執行以下兩條命令:
php artisan queue:table
php artisan migrate
命令的含義,就是在資料庫中建立一個隊列表,用來儲存任務。
好的,儲存任務的列表頁搞好了。接下來就是要進行消費了。這就很簡單啦。
3. 隊列的消費者
這個消費者的概念,對應上官方文檔就是 動隊列監聽服務 ,當它監聽到有要執行的任務時,就會自動按照指定條件執行。
php artisan queue:listen
測試的佇列服務 現在是來檢驗成果的時候了。以我本地環境為例。首先運行程式,產生幾個任務:
在瀏覽器中開啟:http://127.0.0.1/laravel/public/index.php
這個時候開啟資料庫,可看到如下內容:
然後觀察運行監聽程式的dos,當看到以下樣子時,表示程式已經執行完畢:
這個時候,你去對應的目錄,就會看到:test.txt 這個檔案了。
好了,想要瞭解更深入,請參考官方文檔吧。改變準備寫下laravel的Facade,這個讓我理解了很久才理解的概念。