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\[email protected]",
    "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 接到並工作。

You Might Also Like

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料