在開發Web應用程序時,我們經常遇到需要執行耗時操作的情況,例如發送電子郵件、大文件導出、生成報告或進行大量數據處理。如果這些操作在用戶請求時立即執行,將會嚴重影響應用程序的性能和用戶體驗。為了解決這個問題,經過多日來的研發,YzmCMS終于開發出了 隊列 這一功能強大的工具。
隊列的基本概念
隊列是一種將任務組織成隊列以按順序處理的技術。在YzmCMS中,這些任務被表示為類,通過將任務推送到隊列中,我們可以將耗時的操作放到后臺處理,而不會阻塞用戶的請求。
YzmCMS隊列的使用方法:
一、配置隊列
要使用YzmCMS隊列,首先需保證 YzmCMS版本為V7.1及以上版本,然后配置隊列驅動類型。YzmCMS目前支持 database 和 redis 兩種驅動類型。在/common/config/config.php文件中,您可以根據需求指定要使用的隊列參數。
//隊列配置 'queue_connection' => 'database', //隊列驅動類型,支持 database 和 redis 'queue_name' => 'default', //隊列名稱
二、創建表
如果是 database 類型,則必須創建,如果是redis類型,可不創建,但也推薦創建,因為當隊列執行失敗時,YzmCMS會把執行失敗的隊列信息存入到數據庫表中,方便查看日志及再次執行。
php yzm queue table
三、創建隊列任務
每個隊列任務都是一個類。您可以使用 php yzm make job 命令生成一個新的隊列任務類。例如,要創建一個發送電子郵件的隊列任務,可以運行以下命令:
php yzm make job sendemail_job
這將在 /jobs 目錄下創建一個名為 sendemail_job.class.php 的新文件。在這個文件中,您需要在 handle 方法中定義任務的邏輯,例如:
<?php defined('IN_YZMPHP') or exit('Access Denied'); class sendemail_job{ private $params; public function __construct($params = []) { $this->params = $params; } /** * Execute the job. * * @return void */ public function handle() { $email = new SampleEmail($this->params); Mail::to($this->params['email'])->send($email); } }
四、啟動隊列監聽器
php yzm queue work
五、將一個任務添加到隊列中
要執行隊列任務,需要將其推送到隊列中。您可以使用 dispatch 方法將任務推送到隊列中。例如:
/** * 下發任務 * @param string $job 隊列任務類名稱 * @param array $params 傳入的參數,可選 * @param string $queue 隊列名稱,可選 * @return string|false 任務id */ $res = dispatch('sendemail_job', ['email'=>'yzmcms@qq.com'], 'default'); P($res);
這將在后臺處理隊列任務,而不會阻塞您的應用程序。您可以在控制器、事件監聽器或其他適當的位置調用dispatch方法來推送任務。
六、YzmCMS隊列命令詳情
'php yzm queue work' => '啟動隊列工作', -queue=test,指定隊列名稱 -sleep=5,指定連續的任務之間休眠的秒數 -timeout=30,指定隊列任務可以運行的最大秒數 -tries=1,指定隊列任務失敗之前可以嘗試的最大次數 -once=1,只處理一個任務,當任務完成后,工作器將自動退出 'php yzm queue lists' => '查看隊列列表,-queue=test,查看指定隊列(可選)', 'php yzm queue restart' => '重啟隊列工作', 'php yzm queue failed' => '查看所有失敗的任務', 'php yzm queue retry' => '重試失敗任務,需指定一個任務ID(如 queue retry -id=xxxxx)', 'php yzm queue delete' => '刪除單個失敗任務,需指定一個任務ID(如 queue delete -id=xxxxx)', 'php yzm queue flush' => '刪除所有失敗任務', 'php yzm queue table' => '創建隊列表',