公司大部分項目是laravel框架,但有些是yii框架,這兩個框架之間有消息須要通訊,好比在yii框架發佈消息,laravel框架中的隊列去處理,用redis做爲消息鏈接紐帶php
laravel 隊列原理是將類實例化後再序列化存到redis中(序列化的類只存儲屬性值)。消費的時候直接反序列化獲得類和屬性值再去相應的類中找到方法執行laravel
直接上代碼redis
lavavel 消費類json
<?php namespace App\Jobs; class TestJob extends BaseJob{ public $receipt; public $queue = "receipt-to-stock";//定義隊列名稱 和生產隊列中的queue保持一致
public function handle() {
\Log::debug("收到隊列信息:", $this->receipt);
}
public function failed(){
\Log::info("隊列執行失敗");
}
}
yii 生產類框架
<?php namespace App\Jobs; class TestJob extends BaseJob{ private $receipt; public $queue = "receipt-to-stock"; //定義隊列名稱 和消費中的queue保持一致 /** * @param array $receipt 單據 */ public function __construct(array $receipt=[]) { $this->receipt = $receipt; } }
yii 封裝序列化方法yii
$receipt 是要處理的數據
$jobName 是消費和生產的類名如 "App\\Jobs\\TestJob" 二者保持一致,若是不一致請適當調整下面的代碼
public function serializeForLaravelQueue($receipt, $jobName) { $result = [ "displayName" => $jobName,//消費的類名 "job" => "Illuminate\Queue\CallQueuedHandler@call", "maxTries" => null, "timeout" => null, "timeoutAt" => null, "id" => time(), "attempts" => 0, "type" => "job", "tags" => [], "pushedAt" => time(), "data" => [ 'commandName' => $jobName,//消費的類名 'command' => serialize(new $jobName($receipt))//生產的類名 ] ]; return json_encode($result, JSON_UNESCAPED_UNICODE); }
調用this
$data = serializeForLaravelQueue(["hello world"], "App\\Jobs\\TestJob");
$redis->LPUSH("queues:receipt-to-stock", $data);//將序列化的類寫入redis的List中
這個時候在yii框架中發佈消息,laravel項目就會自動處理了!spa
注意事項:debug
一、確保redis在同一個庫中code
二、隊列名保持一致,也就是redis中存儲的key值