超越 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. 專案目錄結構
laravel-swoole/
├── app/ # Laravel 應用程式
├── docker-compose.yml # 容器編排
├── Dockerfile # 應用鏡像構建
├── .env # 環境變數設定
└── nginx/
└── default.conf # 反向代理配置
3. Docker 化環境建置
Dockerfile
我們選用 Debian Slim 作為基底,安裝 Swoole 擴展並優化構建體積。
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。
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 整合與啟動
安裝 Octane:
Bashcomposer require laravel/octane初始化配置:
Bashphp artisan octane:install --server=swoole本地開發啟動(支援代碼變動自動重載):
Bashphp artisan octane:start --server=swoole --watch
5. Nginx 反向代理配置
在 Swoole 模式下,Nginx 的角色轉變為處理靜態資源與轉發動態請求,並能更有效地管理快取與 SSL。
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),這是一套非常值得投入的現代化方案。
沒有留言:
張貼留言