這篇經典舊文列舉了 PHP 在大型系統中的九大短板。時過境遷,PHP 7/8 帶來了巨大性能提升、類型系統、JIT、現代框架生態,許多痛點已被解決或緩解。本文保留原文核心觀點,並補充**現代 PHP(7.4+)的應對方案與最佳實踐**,幫助架構師做技術選型決策。
原文:Zend Engine 使用棧而非堆,遞歸深度受限,Zeev 稱「PHP 不擅長遞歸」。
現狀:PHP 7+ 優化了內存管理,遞歸深度顯著提升(默認 xdebug.max_nesting_level=256,可調)。但**遞歸本質仍受 C 棧限制**,極深遞歸(>1000 層)仍會 Segfault。
應對:
ini_set('xdebug.max_nesting_level', 1000)、增加 ulimit -s、啟用 JIT(PHP 8.0+)原文:PHP 核心線程安全,但擴展不一定,導致 Apache 2.0 Worker MPM 不推薦用 PHP。
現狀:主流生產環境**棄用 Apache MPM**,轉用 **Nginx + PHP-FPM(多進程模型)**,天然繞過線程安全問題。PHP-FPM 每進程獨立內存空間,擴展線程安全與否無關。
應對:標準化部署 **Nginx + PHP-FPM**,避免 Apache Worker + mod_php。
原文:Zend 銷售商業加速器,不內建緩存。
現狀:PHP 5.5+ **內建 OpCache(Zend Optimizer+ 開源版)**,性能提升 2-5 倍,零配置開啟。APCu 提供用戶數據緩存。商業阻礙已消除。
應對:opcache.enable=1、opcache.jit=1255(PHP 8.0+ JIT)、apc.enabled=1,生產必開。
原文:函數名衝突,導致恐怖長函數名(如 xsl_xsltprocessor_transform_to_xml)。
現狀:PHP 5.3+ **完整支持命名空間**,PSR-4 自動加載標準,Composer 依賴管理,現代框架(Laravel、Symfony、Hyperf)全部基於命名空間。舊式前綴風格已成歷史。
應對:嚴格遵循 PSR-4、Composer、命名空間組織代碼,拒絕全局函數污染。
原文:PHP date() 格式字符與 C strftime() 不兼容(如 %j 含義不同),Smarty 混用更亂。
現狀:DateTime / DateTimeImmutable / DateTimeInterface 面向對象 API 統一了操作,IntlDateFormatter 提供 ICU 標準格式化。模板引擎(Twig、Blade)封裝統一過濾器。
應對:禁用 date()/strftime(),統一用 DateTimeImmutable + format() 或 IntlDateFormatter。
原文:手冊列出的擴展(如 PDFlib、ClibPDF)含商業授權。
現狀:Composer/Packagist 生態主流庫採用 MIT/BSD/Apache-2.0 等寬鬆許可。PECL 擴展多為 PHP License/BSD。商業庫已邊緣化,替代方案豐富(如 tcpdf/dompdf 替代 PDFlib)。
應對:composer licenses 掃描依賴許可,CI 集成許可合規檢查。
原文:htmlentities vs html_entity_decode、strpad vs str_pad、大小寫不敏感導致風格混亂。
現狀:核心函數歷史包袱仍在,但**現代開發幾乎不直接調用原生函數**;框架封裝(Str::、Arr::)、工具庫(Illuminate\Support\Str、Spatie\String)、靜態分析(PHPStan/Psalm)規範風格。PHP 8.1+ 引入 #[\SensitiveParameter] 等屬性改進內省。
應對:制定團隊編碼規範,使用 Laravel Helpers / Symfony String / 自建 Wrapper 統一口徑。
原文:magic_quotes_gpc 可開可關,導致雙重轉義或注入風險。
現狀:PHP 5.4 **完全移除 Magic Quotes**。現代防注入靠**預處理語句(PDO Prepared Statements)**、**ORM 參數綁定**、**輸出編碼(htmlspecialchars)**。
應對:全項目禁用舊式轉義,強制 PDO + 參數綁定,輸出時按上下文編碼(HTML/JS/URL/CSS)。
原文:PHP 社區無統一框架,JSP 有 Struts,ASP.NET 有 .NET Framework。
現狀:PHP 擁有**最豐富的框架生態**:Laravel(全棧王者)、Symfony(企業級組件庫)、Hyperf/Swoole(高性能協程)、API Platform(API First)、ThinkPHP(國產優秀)。Composer + Packagist 構建了最活躍的包管理生態。
應對:選型成熟框架(Laravel/Symfony/Hyperf),遵循 MVC/ADR/DDD 架構,拒絕裸寫 PHP。
| 挑戰 | 描述 | 應對 |
|---|---|---|
| 單請求阻塞模型 | FPM 進程模型難以支撐高併發長連接(WebSocket、SSE、gRPC 流) | Swoole/OpenSwoole/RoadRunner/Hyperf 協程化、常駐內存 |
| 類型系統仍有漏洞 | 無泛型、無泛型數組、聯合類型運行時不強制 | PHPStan/Psalm Level 5+、PHP 8.2+ readonly/DNF 型別、Rector 自動修復 |
| 依賴管理地獄 | Composer 鑰石鎖定、插件衝突、棄用包泛濫 | Composer 2.6+ 禁用插件、依賴鎖定、定期 composer update --dry-run |
| 遺留代碼債 | 大量 PHP 5.x/7.0 代碼庫阻礙升級 | Rector 自動升級、分模塊重寫、Strangler Fig 模式 |
| 人才斷層 | 初級開發者只會 CRUD,缺乏架構、性能調優、底層原理能力 | 內部技能體系建設、代碼評審機制、開源貢獻激勵 |
**PHP 不是完美語言,但已不是當年那個 PHP**。九大歷史痛點中,8 個已被語言演進、生態建設徹底或大幅解決。現代 PHP(8.1+)擁有**強類型、JIT、協程、現代框架、豐富生態、活躍社區**。選型關鍵在於:**團隊技術棧匹配度、業務場景契合度、長期維護成本**。對於 Web 應用、API 服務、中後台系統,PHP 仍是**性價比極高、交付速度最快**的選擇之一。拒絕刻板印象,拥抱現代 PHP 工程化實踐。