如果你這禮拜略過了 PHP 圈的電子報,那你錯過了一份「看起來像維護更新、實際上是政權更替」的 release note。FrankenPHP 1.11.3 上週上線,三行說明合在一起,等於正式宣告 Nginx + PHP-FPM 不再是新 Laravel / Symfony 專案的「合理預設」。
這次釋出把靜態 binary 內附的 PHP 升到 PHP 8.5、底層 Caddy 升到 2.11,並回滾了 1.11.2 那個短暫弄壞 worker mode 的 INI reset。釋出說明的語氣是「穩定與版本提升」。實際上,這是 FrankenPHP 變成「如果你今天從零開始,會選的那個 runtime」的一刻。
一、為什麼這次是分水嶺
FrankenPHP 從 2023 年起技術上就有趣,但採用率天花板永遠卡在三個問題:「夠穩嗎?」「我用的框架支援嗎?」「我的 hosting 商願意跑嗎?」2026 年 5 月,這三個顧慮在兩週內全數蒸發。
穩定——1.11.3 明確修掉了把人嚇跑的 1.11.2 worker-mode regression。框架支援——Symfony 8.1.0-BETA1 在 Runtime component 加入了 FRANKENPHP_RESET_KERNEL,代表 Symfony 在 worker 模式下「會自己 reset kernel」,不需要你再黏一段膠水。Laravel Octane 早就把 FrankenPHP 列為一級 driver,已滿一年。Hosting——Clever Cloud 二月底的 image 更新已把 FrankenPHP 1.11.3 作為 managed runtime 出貨,你只要設 CC_PHP_VERSION=8.5 就拿得到 PHP 8.5。
再加上今年初官方 PHP Foundation 正式支持 FrankenPHP,原本讓保守工作室留在 PHP-FPM 的「政治風險」也沒了。
二、實際拿到什麼——數字
外面在傳的數字是「同一支 Laravel 應用,FrankenPHP worker 模式 ~15,000 req/sec、傳統 PHP-FPM ~4,000 req/sec」。請當作上限值看,實際數字嚴重取決於框架啟動成本、第三方 middleware、資料庫往返。但即使是一個典型的 Laravel 後台、用了 Eloquent 加幾個套件,真實世界回報通常落在 3× 到 5× 吞吐量之間。
原因是結構性的:worker 模式下,你的 Laravel app 在每個 worker process 「只 boot 一次」,然後保持熱機。每個請求不再付出 30–80 ms 的 bootstrap 成本。靜態檔、HTTPS、HTTP/3、reverse proxy 這些事都由同一份 binary 裡的 Caddy 2.11 處理——沒有另一份 Nginx 設定檔、沒有第二個 process 要監控、沒有獨立的 Let's Encrypt cron。
三、PHP 8.5:小功能,大重構
PHP 8.5 隨 FrankenPHP 進來,三個功能這一季你的程式碼會想用:pipe operator、clone with modifications、原生 URI 擴充。光是 pipe operator 就能讓你在不犧牲可讀性的前提下,把一些舊 Laravel 程式裡冗長的 collect()->map()->filter() 鏈刪掉一截。Clone-with-modifications 解掉一整類在 DTO 程式裡常出現的 immutability bug。原生 URI 擴充意思是 league/uri 可以從 composer.json 拿掉一個——少一個 dependency 要稽核。
四、遷移流程——這次真的很短
對既有 Laravel 專案,遷移真的是「下午就能完成」:裝 Octane、在 octane.php 把 server 設成 FrankenPHP、稽核任何把狀態放在 static 屬性裡的程式(worker 模式唯一常見地雷),然後出貨。對 Symfony 8.1 beta 的專案,設 FRANKENPHP_RESET_KERNEL=1,就拿到一樣的熱機 process 行為,且沒有 kernel state 漏洩。
Docker image 官方支援。靜態 binary 在裸機就能跑。Caddy 自動處理 TLS。對一個典型接案客戶來說,「為什麼還要在前面再加一層 Nginx」這個問題,第一次沒有明顯答案。
五、我們未來 stack 的預設值要怎麼換
對 2026 年在出貨客戶案的小工作室,這次有三件操作預設值會變。Server provisioning script 可以把 Nginx 角色拿掉。部署流水線從兩個 service 變一個 binary。On-call 表面縮小——Caddy + FrankenPHP 是一棵 process tree,不是兩棵。每件單看都不戲劇化,合在一起,會把整類「為什麼網站凌晨三點掛掉」的工單從根上抽掉。
我的觀點
FrankenPHP 想讓你講的故事是「我們把 PHP 變快了」。比較誠實的故事是「我們把 PHP 變回簡單了」。過去 20 年,所有正經的 PHP 部署都是 Nginx + PHP-FPM + process supervisor + TLS 層的四明治——四個會動的零件需要在 timeout、buffer size、graceful reload 語意上互相同意。1.11.3 把這個明治悄悄壓成「一個由 Foundation 背書的 Go binary」。原本還在等「拐點到了再推給客戶」的工作室——拐點就是上禮拜,幾乎沒有人發現。
資料來源
- FrankenPHP releases — GitHub
- Images update: FrankenPHP 1.11.3 (PHP 8.5), Request Flow in all runtimes — Clever Cloud Documentation
- Symfony 8.1.0-BETA1 released — Symfony Blog
- A Week of Symfony #1009 (April 27 – May 3, 2026) — Symfony Blog
- What's New in PHP 2026: Modern Features for Production — DeployHQ
- State of PHP 2026 — Dev Newsletter