Thinkphp使用消息隊列Queue。我的ThinkPHP版本是5.0
使用composer安裝queue包,命令行進入到項目的根目錄,輸入:
composer require topthink/think-queue
安裝完在項目生成了application/extra/queue.php文件,這個是配置消息隊列,這裏使用redis作爲驅動,配置修改爲下面內容:
<?php
return [
'connector' => 'Redis',
'expire' => 180, // 任務過期時間,若要禁止則設置爲null
'default' => 'default', // 默認隊列名稱
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'select' => 6, // redis db
'timeout' => 0, // redis連接超時時間
'persistent' => false, // 是否是長連接
];
創建任務。
在application/index/controller下,創建MyQueue.php控制器,代碼如下:
<?php
namespace app\index\controller;
use think\Queue;
class MyQueue {
public function index() {
// 任務類 - 執行時調用該類的deal方法
$job_class = "app\index\job\Message@deal";
// 隊列名稱
$job_queue_name = 'Check';
// 數據
$job_data = array('timestamp' => time());
// 把任務加入到消息隊列,等待被執行
// 延遲發送任務 5秒
$is_push = Queue::later(5, $job_class, $job_data, $job_queue_name);
// 立即發送任務
// $is_push = Queue::push($job_class, $job_data, $job_queue_name);
if($is_push !== false ){
echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>";
}else{
echo 'Oops, something went wrong.';
}
}
}
實現任務的具體內容,在application/index/job/創建Message.php,代碼如下:
<?php
namespace app\index\job;
use think\queue\Job;
class Message {
/* 處理邏輯 */
public function deal(Job $job, $data) {
// 這裏實現邏輯
// 任務執行成功 刪除任務
$job->delete();
}
}
測試:
瀏覽器打開http://xxxx/index/MyQueue/index,添加任務完成
命令行進入到項目根目錄,輸入下面命令執行任務:
php think queue:work --queue Check
監聽模式的啓動方式可以實現定時器的效果,啓動命令:
php think queue:listen --queue Check
listen的方式就是一直在監聽,如果有動態加入的任務,會一直執行下去。
listen方式的後臺啓動命令:
php think queue:listen --queue CheckMessageStatus 1>/dev/null 2>&1 &
參考文檔:https://github.com/coolseven/notes/blob/master/thinkphp-queue/README.md