PHP 筆記 – 從 CodeIgniter 發 Message 到 SQS 給 Laravel Jobs 接
開場白
收發 Aws SQS Queue,如果都用 Laravel Jobs 收發,那很簡單照著文件加幾行程式就搞定了,例如 這篇教學。
不過如果需要跨框架,例如我想從 CodeIgniter 寫的系統,發 Message 到同一個 SQS Channel 內,讓 Laravel 接收與處理,要怎麼做呢?
解法
研究了一會,最後採用土方法 – 自己觀察 Laravel Jobs 打上 SQS 的資料格式,然後直接手刻一套資料,內容&結構完全一樣,打上去以後, Laravel 的 Queue Worker 就可以順利的處理。
以下提供我從 CodeIgniter 打上去的簡要筆記
情境
首先, Laravel 這邊應該已經寫好一個接收 Queue 的工作,並且串連 Aws SQS。
假設 Laravel 這邊是像下面這樣寫, class 名稱是 MyJob
class MyJob extends Job { ... }
Codeigniter 這邊的工作
1. 在 Codeigniter 這邊,先複刻出一個相同 namespace 的 class
自行去觀察 Laravel 自己打上 Queue 的格式,會發現他有一些格式、且有 namespace 叫做 App\Jobs。
所以我先在 CodeIgniter 這邊複刻一個相同的 class,如下範例。
namespace App\Jobs; class MyJob { public $data = []; public $tries = 5; public $timeout = 60; public $connection = null; public $queue = ""; public $chainConnection = null; public $chainQueue = null; public $delay = null; public $chained = []; }
2. 存到 php 檔案
存為 MyJob.php,路徑部分我存到 application/libraries 下,但路徑不太重要,重要的是 namespace
3. 需要發 Queue Message 的地方, require 引入 MyJobs.php
require_once APPPATH . '/libraries/MyJob.php';
附註: 要模擬出相同 namespace 的方式,還可以考慮走 composer autoload ,不過這邊以簡便先達成功能為主。
4. 發送 Queue Message
4.1 new 一個 MyJob
- 指派 data 與 queue 的值
- 這裡的 data 是你自定的資料內容,比如下面範例就是一個 Array。
$queueObj = new \App\Jobs\MyJob(); $queueObj->data = [ Your Array Data]; $queueObj->queue = "Your_SQS_Name";
4.2 new 一個 SqsClient
這是 AWS 的 SDK ,用法請參考 文件
$sqs_client = new SqsClient(你的 SqsClient 設定檔);
4.3 執行 sendMessage 把 Queue 打上去
$sqs_client->sendMessage([ 'QueueUrl' => $queue_url, 'MessageBody' => json_encode([ "displayName"=>"App\Jobs\MyJob", "job"=>"Illuminate\Queue\CallQueuedHandler@call", "maxTries"=>5, "timeout"=>60, "timeoutAt"=>null, "data" => [ "commandName"=>"App\Jobs\MyJob", "command" => serialize($queueObj) ] ]) ];
- $queueObj 需做 serialize,如上範例。
- 這裡的結構完全仿照 Laravel Jobs 打到 Queue 內的資料架構,完全照抄。
4.4 完成
搞定~ 打上去之後,順利的話,就可以看到 Laravel 的 Worker 把 Message 收走了。
後記
所以理論上,各種後端程式只要能送訊息到 Aws SQS 的,只要把這個結構做出來並打到 SQS 上,那麼理論上就都能讓 Laravel 這邊的 Worker 接到並工作。
Leave a Reply