如何在Laravel使用 Job、Queue、Supervisor

這篇記錄一下學習、實做過程的步驟和遇到的問題、避免以後忘記了又要重新找資料重學一次

分享

這篇記錄一下實做過程的步驟和遇到的問題,
避免以後忘記了又要重新再學一次

本篇分為3個部分:
1. 如何配置和分派任務
2. CentOS 7 執行 Supervisor
3. Laradock執行 Supervisor


如果用 database 當作紀錄工具,首先需要生成一個 table,預設名稱是 jobs

php artisan queue:table 
php artisan migrate

然後找到 .env 這隻檔案的 QUEUE_DRIVER,調整如下QUEUE_DRIVER=database #原本是sync,看需求也可改為redis

然後生成一個:可派發任務的 job class

php artisan make:job ProcessJob # 名稱隨你取

然後這個檔案會存在於 app/Jobs 路徑底下

ProcessJob

// 任務生存時間
 public $timeout = 60;// 想傳遞進來的參數
 protected $id;/**
  * 實例化
  */
 public function __construct($id)
 {
   $this->id = $id;
 } /**
  * 要做的事放這裡
  */
 public function handle()
 {
   doSomething($this->id);
 }
}

然後在任何地方 ,例如 route/web.php 內,或是 XxxController.php 內引用 ProcessJob 這個 class 後就可以使用 dispatch() 這個 function 去派發任務到 queue ,然後在 database 的
jobs table裡面就可以看到一堆等待執行的任務了~# 實例化的時候就要把參數丟進,不然 ProcessJob 就會報錯 (參數數量不對...)
$job = new ProcessJob($id);# dispatch 的時候也要再丟一次參數(不是new的時候給過了嗎? 有朋友能幫忙解惑嗎?)
$job->dispatch($id)->onQueue('queue_num_1')->delay(10);### ps. onQueue、delay 為選填項目,分別為頻道和任務延遲執行時間 ###

單執行序監聽php artisan queue:work

執行後,如果有任務就會執行,否則就會持續監聽等待任務


多執行序監聽Supervisor

下面分一般 linux 執行supervisor,和 Laradock 環境執行supervisor,其實都是執行Supervisor的流程

一般 Linux 執行supervisor

過程中遇到了一些問題,然後是參考這兩個網站的內容
Centos7.3配置Supervisor遇到的一些小问题
Why I get this error laravel-worker: ERROR (no such group)

首先要先安裝套件

yum install -y supervisor
cd /etc/supervisord.d // 然後你可以在這個路徑底下寫一個設定檔 
vi laravel-worker.ini // 注意副檔名

官網寫預設是在這個路徑底下 /etc/supervisor/conf.d
寫一份這檔名的檔案 laravel-worker.conf
然後你就會看到噴錯啦!!!
因為在 /etc/supervisord.conf裡寫的是[include]
files = supervisord.d/*.ini

然後在 laravel-worker.ini這份檔案裡

[program:laravel-worker]  # 啟動時需要這個名稱 
process_name=%(program_name)s_%(process_num)02d
command=php /[laravel-workspace]/artisan
# artisan 的路徑要自己調整,下是可選參數  
# database/redis        driver 
# --queue=
autostart=true 
autorestart=true 
user=root               # 執行人 
numprocs=8              # 執行序數量 
redirect_stderr=true 
stdout_logfile=/home/forge/app.com/worker.log

寫好了以後可以照官網寫的順序啟動

啟動 Supervisor

一旦設定檔案被建立,你可以使用以下指令更新及啟動 Supervisor:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Laradock 環境執行supervisor

依照Laradock官方文件內容:在 php-worker 目錄下先複製這個檔案laravel-worker.conf.example => laravel-worker.conf

內容大致和上面的 laravel-worker.ini內容相同、主要調整 command 的部分後就可以執行docker-compose up -d --build php-worker

之後便會自行啟動監聽,可以執行下列指令查看:docker exec -it laradock_php-worker_1 top

會看到有多個執行序

如果沒有正常執行等待中的任務,可以嘗試執行

supervisorctl reread

或是修改laravel-worker.conf 指定監聽某個頻道 --queue=? 後重新 build
然後執行上面的 reread …

到此完結~ 謝謝收看

Read more

Gaze Guard 短影片旁白的 TTS 成本與隱私防護示意圖

短影片旁白的成本,其實比我想像低

我最近在做一支 Gaze Guard 的 20 秒產品介紹影片。 原本想說簡單做個動畫就好。 後來想說如果有配音,會感覺比較生動也比較能夠描述使用的情境和達成的效果。 這次我測了什麼 我測的是產品介紹影片用的英文旁白。 工具底層使用的是 Edge TTS,也就是 Microsoft Edge 的線上 Text-to-Speech 服務。常見的底層工具是 edge-tts。 這不是正式 Azure Speech API 的計費路徑。 在我這次的環境裡,它沒有要求 API key,也沒有回傳可見的 per-use billing。 所以這次測試本身,比較像是快速 prototype。 如果未來要正式商用、穩定大量產出,就要回頭看 Azure Speech、OpenAI TTS、ElevenLabs 這類正式付費方案。

By SteepingLogic
用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

# 用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard 我有一台 local Hermes。 平常它就在自己的機器上跑。 可能是家裡的桌機。 可能是 NAS。 可能是一台一直開著的 Linux box。 也可能只是我自己的筆電。 問題是,人一離開那個網路,Hermes dashboard 就變成一個只存在於 localhost 的東西。 我想在外面打開它。 但我沒有 static IP。 沒有買網域。 也不想進路由器開 port forwarding。 因為那條路通常長這樣: * 找 public IP * 設定 NAT * 開 port * 處理防火牆 * 補 HTTPS * 設定憑證 * 再擔心 origin IP 被掃 非常友善。 所以這篇先走另一條路:

By SteepingLogic
Invoshot 開發日記|正向回饋

Invoshot 開發日記|正向回饋

想信很多人在開發的時候都常常會做一件事,那就是: 不斷地反覆思考,在腦袋內把流程跑過很多次,然後思考哪裡可以做得更好 不限坐在電腦前的時後,可能是在捷運上,在人行道上, 在馬桶上或是在洗澡的時候 🤪 我不斷地在想:AI 辨識完一張發票後,使用者接下來最需要的是什麼? 每個欄位都要核對嗎? 這麼多欄位真的不會漏看嗎? 所以我在 Invoshot 裡加了提醒功能。 辨識結果出來後,系統會把比較需要注意的地方標出來。 不是把所有不確定都丟給使用者,而是把他真正需要介入的那幾秒鐘留出來。 今天收到一則訊息: 今天用了有新增提醒功能很棒! 真的有變輕鬆 😎 看到這句的時候,我第一個想到的是: 原來那些只是我腦內風暴的優化項目,使用者是真的可以感受到差異的! 感覺又有動力了!

By SteepingLogic