laravel隊列


對列作用
  隊列的目的是將耗時的任務延時處理,比如發送郵件,從而大幅度縮短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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM