iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
Modern Web

Laravel 12 開發者幸福度升級指南系列 第 22

Day 22:透過 Http::pool 和 Concurrency 平行處理任務

  • 分享至 

  • xImage
  •  

除了利用快取來減少資料庫本身的負擔,縱向或者橫向拓展來提升主機資源以外,還有一個提升系統承載量的方式,是將部分 IO 存取平行進行。

今天我們就來聊聊在 Laravel 裡面怎麼做到這件事情

為什麼需要加上平行流程

在系統運作期間,我們可能會遇到一些流程,像是存取資料庫、存取第三方 API、寫入檔案……等等

這些操作其實並不消耗計算資源,但是由於要等待網路等輸入輸出(Input/Output,I/O),所以等待會比較花時間。

如果要不在這上面花時間,我們可以將這段邏輯開始執行後,先放到一旁等待完成。等之後需要取得對應資料時,再去取出結果。

也就是平行處理任務的概念

Http facade 用法

存取第三方 API 時,Laravel 一般的方式,是使用 Http 這個 facade。

$response = Http::get('http://example.com');

如果我們想要同時取出多個 API 內容,而不是等第一筆取出之後再存取下一個 API,

我們可以使用 Http::pool()

$responses = Http::pool(fn (Pool $pool) => [
    $pool->get('http://api.1.io/'),
    $pool->get('http://api.2.io/'),
    $pool->get('http://api.3.io/'),
]);

$responses 會拿到所有回傳的陣列,所以我們以陣列的方式操作即可

Concurrency

除了 API 存取之外,有時候我們也會希望其他的任務可以

這時候我們可以利用 Concurrency 來幫我們將任務分成不同進程處理

[$userCount, $orderCount] = Concurrency::run([
    fn () => DB::table('users')->count(),
    fn () => DB::table('orders')->count(),
]);

這樣一來,任務就不會被耗時的 I/O 所阻擋了。

一點後記

由於 PHP 語言的特性,以及 Laravel 框架設計的概念。

其實在平行處理任務上面,確實並不是很好處理。

和其他語言可以在複雜的任務上建立執行緒甚至協程比較,Laravel 能做的事情相對少了很多。

不過這邊還是介紹了一些處理的方式,希望如果讀者的專案遇到效能問題,可以看到對應的處理方式。

今天的部分就到這邊,我們明天見!


上一篇
Day 21:透過橫向擴展以及縱向擴展,提升系統的承載量
系列文
Laravel 12 開發者幸福度升級指南22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言