2025年12月27日 星期六

超越 PHP-FPM:使用 Laravel Octane + Swoole + Docker 打造高性能常駐服務

超越 PHP-FPM:使用 Laravel Octane + Swoole + Docker 打造高性能常駐服務

1. 目標 (Objective)

在傳統 PHP-FPM 模式下,每個 Request 都是從零開始的「生命週期」:加載核心、初始化 Provider、連線資料庫,最後銷毀。這種 "Share-Nothing" 架構雖然安全,但在高併發場景下會產生巨大的重複開銷。

本文旨在透過 Laravel Octane 整合 Swoole,將框架常駐於記憶體中,消除啟動損耗。我們將透過 Docker 建置一套生產級別的 PHP 8.4 高性能環境,實現毫秒級的響應速度與極高的系統吞吐量。


2. 技術亮點 (Technical Highlights)

  • 記憶體常駐 (Memory Residency):框架僅在啟動時加載一次,隨後的請求直接進入路由邏輯,效能提升可達 3-5 倍。

  • PHP 8.4 效能加持:利用最新版 PHP 的 JIT 與 記憶體優化,進一步壓低 TTFB

  • 協程 (Coroutine) 支援:Swoole 提供非阻塞 I/O,讓 PHP 也能處理高併發 WebSocket 或非同步任務。

  • 自動化重載 (Hot Reload):搭配 Octane watch 模式,解決常駐服務在開發時需頻繁重啟的痛點。


3. 架構圖描述 (Architecture Diagram)

與 PHP-FPM 不同,Nginx 不再透過 FastCGI 協議,而是改用標準的 HTTP 代理與 Octane 通訊:

Plaintext
[ Client Browser ]
       │
       ▼ (HTTP/HTTPS)
[ Nginx (Reverse Proxy) ] ── (Port 80)
       │
       ├─── (Static Assets) ──▶ [ /public ]
       │
       └─── (Proxy Pass) ─────▶ [ Laravel Octane (Swoole) ] ── (Port 1215)
                                    │
                                    ├─── [ Memory Resident Framework ]
                                    └─── [ Connection Pool (MySQL/Redis) ]

4. Docker 化環境實戰

A. 針對 PHP 8.4 優化的 Dockerfile

為了支援 Swoole,我們必須手動安裝擴展。這裡選用 php:8.4-cli 作為基底。

Dockerfile
FROM php:8.4-cli-bullseye

# 安裝 Swoole 必備編譯套件
RUN apt-get update && apt-get install -y --no-install-recommends \
    git unzip libzip-dev libssl-dev libcurl4-openssl-dev pkg-config && \
    rm -rf /var/lib/apt/lists/*

# 安裝 PHP 核心擴展與 Swoole
RUN docker-php-ext-install pdo_mysql zip sockets pcntl opcache && \
    pecl install swoole && \
    docker-php-ext-enable swoole

# 引入 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www
COPY . .

# 修正 Laravel 必要權限
RUN chown -R www-data:www-data storage bootstrap/cache

# 暴露 Octane 預設埠
EXPOSE 1215

# 使用 Octane 啟動 Swoole 伺服器
CMD ["php", "artisan", "octane:start", "--server=swoole", "--host=0.0.0.0", "--port=1215"]

B. Nginx 反向代理配置 (nginx/default.conf)

Swoole 模式下,Nginx 必須設定為高效的 Proxy:

Nginx
server {
    listen 80;
    root /var/www/public;
    index index.php;

    location / {
        try_files $uri $uri/ @octane;
    }

    location @octane {
        proxy_pass http://app:1215;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # 支援 WebSocket
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

5. 流程圖描述 (Flowchart)

  1. Server Boot:Swoole 啟動並預先加載 Laravel 核心與所有 Service Providers。

  2. Request Inbound:Nginx 接收請求並轉發至 1215 埠。

  3. State Reset:Octane 自動清理前次請求的沙盒狀態,避免記憶體污染。

  4. Logical Execution:直接從記憶體調用 Controller 邏輯。

  5. Connection Management:利用 Swoole 協程從連線池(Connection Pool)快速取得資料庫控制權。


6. 重要開發準則:避免常見陷阱

[!IMPORTANT]

「常駐記憶體」是一把雙面刃,開發習慣必須從 Web 模式切換至 CLI 模式。

  • 單例污染 (Singleton Pollution):

    嚴禁在 register 或 boot 中快取任何與「當前請求」相關的數據。如果你的 Service 中有存儲 Request 狀態,請務必將該類別加入 octane.php 的 flush 配置中。

  • 避免全域 static 變數:

    靜態屬性在常駐模式下會「跨請求」存在,如果不手動清理,會導致 A 用戶看到 B 用戶資料的資安問題。

  • 資料庫與連線池:

    Octane 會自動管理連線。若手動開闢協程(Coroutine),請確保連線能正確釋放,否則會發生 Too many connections 錯誤。


7. 結論 (Conclusion)

透過 Laravel Octane + Swoole + Docker,我們成功讓 PHP 擺脫了傳統架構的枷鎖。這套方案不僅能大幅縮短響應時間(TTFB),更能顯著降低雲端伺服器的 CPU 負載與基礎設施成本。

沒有留言:

張貼留言

AI 浪潮下的軟體業轉型:從「程式碼產出」到「價值驗證」的權力移轉

  前言:消失的「碼農」,崛起的「編排者」 過去兩年,媒體熱衷於討論 AI 是否會取代體力勞動者。然而,身處風暴中心的軟體從業人員心知肚明: 衝擊最深、速度最快的,其實是軟體產業。 AI 改變的不只是 IDE 裡的自動補全,它正在重塑軟體生產的「價值公式」。我們必須認清一個現實...