對列作用
佇列的目的是將耗時的任務延時處理,比如發送郵件,從而大幅度縮短Web請求和相應的時間,
佇列行程原理:寫一個死回圈的腳本在Linux系統持續運行,新的佇列任務push到這個腳本中,
一、配置
佇列 組態檔存放在config/queue.php ,在該檔案中你將會找到框架自帶的每一個佇列驅動的連接配置,包括資料庫、
Beanstalkd、 IronMQ、 Amazon SQS、 Redis 以及同步(本地使用)驅動,其中還包含了一個 null 佇列驅動以拒絕隊
列任務,默認是sync,即同步的,直接處理,無佇列.要將其修改為對應的型別,如database等,
這次主要探討 使用database 保存佇列任務,
// 在.env 檔案中修改:
QUEUE_DRIVER=database
// 清除配置快取,這是個巨坑,測驗時因為沒執行這一步導致配置不生效,懵逼了許久
php artisan config:cache
二、依賴
1.資料庫依賴:為了使用database 佇列驅動,需要一張資料庫表來存放任務,要生成創建該表的遷移,
運行 Artisan 命令queue:table ,遷移被創建好了之后,使用migrate 命令運行遷移:
php artisan queue:table
php artisan migrate
// 資料庫會生成以下兩張表:
jobs
migrations
2.其他佇列型別依賴
下面是以上列出佇列驅動需要安裝的依賴:
? Amazon SQS: aws/aws-sdk-php ~3.0
? Beanstalkd: pda/pheanstalk ~3.0
? IronMQ: iron-io/iron_mq ~2.0
? Redis: predis/predis ~1.0
注意:
1、因為我使用兩套環境(虛擬機、本地,兩套環境共享專案目錄),正常訪問的是虛擬機的資料庫,但使用 php artisan migrate
相關命令時報 2002 拒絕連接錯誤 ,因為在控制臺訪問到了本地的資料庫,所以資料庫配置:
DB_HOST=localhost
修改為 具體的ip:
DB_HOST=192.168.82.52
清除快取:
php artisan config:cache
2、報錯:SQLSTATE[42000]: 1071 Specified key was too long; max key length is 767 bytes
動配置遷移生成的默認字串長度,你可以通過呼叫 AppServiceProvider 中的 Schema::defaultStringLength 方法來配置它,
區域配置:在報錯的遷移腳本中加 Schema::defaultStringLength(191);
全域配置:在App\Providers\AppServiceProvider 的boot方法加Schema::defaultStringLength(191);
三、生成任務類
1、通常,所有的任務類都保存在 app/Jobs 目錄.如果 app/Jobs 不存在,在運行 Artisan 命令 make:job 的時候,
它將會自動創建,你可以通過 Artisan CLI 來生成佇列任務類:
php artisan make:job queueTest
生成的類 queueTest 都實作了 Illuminate\Contracts\Queue\ShouldQueue 介面,
告訴 Laravel 將該任務推送到佇列,而不是立即運行,
2、在 queueTest.php 的代碼如下:
public function handle()
{
sleep(5);
Zhang::insert([ 'name' => 'queue.' . time() .uniqid(), 'time' => time()]);
}
// 在TestController.php 控制器的推送任務如下:
public function queueTest()
{
for($i = 0; $i < 100; $i ++) {
dispatch(new queueTest("ssss".$i));
}
exit('程式結束');
}
// routes添加路由:
Route::get('/queue', 'TestController@queue' );
四、啟動佇列監聽
基本命令:
php artisan queue:listen //監聽佇列請求,只要運行著,就能一直接受請求,除非手動終止;
其他型別的監聽、守護行程請參考頂部資料,
五、測驗成功
在瀏覽器開幾個視窗同時訪問該地址:localhost/queue , 出現以下情況說明佇列任務推送成功:
1、訪問后,瀏覽器立即列印 '程式結束' ,說明任務已經壓入佇列;
2、進入資料庫查看jods表,會發現很多還沒執行完的任務;
3、在控制臺會監聽到正在運行的行程:
[2018-01-03 11:53:46] Processing: App\Jobs\queueTest
[2018-01-03 11:53:56] Processed: App\Jobs\queueTest
[2018-01-03 11:53:57] Processing: App\Jobs\queueTest
總結
以上只是對laravel佇列的一些基于database的基礎運用,佇列的知識遠遠不止這些,如果你有好的例子分享,歡迎留言,
有需要交流的小伙伴可以點擊這里加本人QQ:luke
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/125413.html
標籤:PHP
