2025年12月27日 星期六

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

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

前言

在傳統的 PHP-FPM 模式下,每個 HTTP 請求都必須經歷啟動 PHP 腳本、加載框架核心、初始化服務等流程。當面對高併發需求時,這類重複性的開銷會成為嚴重的效能瓶頸。透過 Swoole 異步網路引擎,我們能讓 Laravel 常駐於記憶體中,實現毫秒級的響應速度。本文將帶領你透過 Docker 快速搭建這套高性能架構。


1. 核心優勢:為什麼選用 Swoole?

  • 常駐記憶體 (Memory Resident):框架只需加載一次,大幅減少磁碟 I/O 與 CPU 負擔。

  • 非阻塞 I/O:支援非同步任務處理,提升伺服器吞吐量。

  • Laravel Octane 優化:官方提供的封裝層,讓開發者無需深入底層 Swoole API 也能享受高效能。


2. 專案目錄結構

Plaintext
laravel-swoole/
├── app/                # Laravel 應用程式
├── docker-compose.yml  # 容器編排
├── Dockerfile          # 應用鏡像構建
├── .env                # 環境變數設定
└── nginx/
    └── default.conf    # 反向代理配置

3. Docker 化環境建置

Dockerfile

我們選用 Debian Slim 作為基底,安裝 Swoole 擴展並優化構建體積。

Dockerfile
FROM php:8.2-cli-bullseye

# 安裝系統依賴
RUN apt-get update && apt-get install -y --no-install-recommends \
    git unzip libzip-dev libssl-dev libcurl4-openssl-dev \
    libpq-dev libxml2-dev pkg-config && \
    rm -rf /var/lib/apt/lists/*

# 安裝核心擴展
RUN docker-php-ext-install pdo_mysql zip sockets opcache pcntl

# 安裝並啟用 Swoole 擴展
RUN pecl install swoole && \
    docker-php-ext-enable swoole

# 安裝 Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www
COPY . .

# 設定權限
RUN chown -R www-data:www-data storage bootstrap/cache

EXPOSE 1215

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

docker-compose.yml

整合應用伺服器、Nginx 反向代理與 Redis。

YAML
version: "3.9"
services:
  app:
    build: .
    container_name: laravel-app
    volumes:
      - .:/var/www
    environment:
      - APP_ENV=local
    depends_on:
      - redis

  nginx:
    image: nginx:alpine
    container_name: laravel-nginx
    ports:
      - "80:80"
    volumes:
      - .:/var/www
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

  redis:
    image: redis:alpine

4. Laravel Octane 整合與啟動

  1. 安裝 Octane

    Bash
    composer require laravel/octane
    
  2. 初始化配置

    Bash
    php artisan octane:install --server=swoole
    
  3. 本地開發啟動(支援代碼變動自動重載):

    Bash
    php artisan octane:start --server=swoole --watch
    

5. Nginx 反向代理配置

在 Swoole 模式下,Nginx 的角色轉變為處理靜態資源與轉發動態請求,並能更有效地管理快取與 SSL。

Nginx
server {
    listen 80;
    server_name localhost;
    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 Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400s;
    }
}

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

由於應用常駐於記憶體中,開發習慣必須隨之改變:

  • 避免單例污染 (Singleton Pollution):

    不要在 Service Provider 的 register 或 boot 中存放與「特定 Request」相關的狀態。如果必須存放,應在請求結束後重置。

  • 清理記憶體:

    盡量減少使用全域變數或靜態屬性。

  • 資料庫連線池:

    Octane 會自動管理連線。若手動開闢協程,請確保資料庫與 Redis 的連線能正確歸還至連線池,避免連線耗盡。


7. 結論

透過 Laravel + Swoole + Docker 的架構,我們將 PHP 的性能提升到了一個新的層次。這不僅能大幅縮短響應時間(TTFB),更能節省雲端伺服器的資源成本。對於需要高吞吐量的 API 服務或即時應用(如 WebSocket),這是一套非常值得投入的現代化方案。



沒有留言:

張貼留言

[技術深度] 打造 Laravel 12 高併發即時客服系統:從 Octane Swoole 到 Reverb 擴展架構

[技術深度] 打造 Laravel 12 高併發即時客服系統:從 Octane Swoole 到 Reverb 擴展架構 🏎️ 1. 內存常駐化:Laravel Octane + Swoole 的性能飛躍 傳統 PHP-FPM 每個 Request 都要經歷一次框架加載( B...