Thinkphp使用消息隊列Queue

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章