容器化(Containerization),這是一個由 Docker 公司所發揚光大的一種技術,它能夠很好地封裝應用程式與所需函式庫,而且通常有著比 虛擬化(Virtualization) 更高的效能。
一般來說,編譯式語言都很容易被容器化,例如 C/C++ 或 Golang,這是因為只需要在容器中設定好相依函式庫(通常是指動態函式庫),其編譯出的執行檔就可以直接在容器中運行。
這對 PHP 這類直譯式語就不是個好消息,其運行環境往往受制於 Apache PHP Module 或 PHP-FPM,再加上現代 PHP 往往會整合 Composer 進行相依性套件管理,這使得其處境更加雪上加霜。
PHP 的運行環境概述
PHP 官方共支援 8 種 伺服器 API(SAPI, Server Application Programming Interface),用於使伺服器(如 Apache 或 Nginx)與 PHP 運行環境相互溝通,其中粗體字表示為較常使用的 SAPI:
- apache2handler
- cgi
- cli
- embed
- fmp
- fuzzer
- litespeed
- phpdbg
摒除 CLI 用於與命令介面交互之外,通常是使用 Apache 及可支援 FPM 的網頁伺服器互相搭配。
近年來,Swoole 發展迅速。開發者能夠利用 CLI 的 SAPI 直接執行一個完整的、可生產使用(Production Ready)的 Web Server 用於執行 PHP 應用程式。
目前 Laravel 官方也提供了 Laravel Octane 作為 Swoole 及 Roadrunner 的 Wrapper。
Apache HTTP Server
這是一個自 1995 年就發佈的老牌 HTTP 伺服器軟體,因為其廣大的用戶群與支援性,至今仍有許多網站選擇使用。
因為其驚人的市佔率,PHP 能夠以模組的形式被載入 Apache2 中,並且依賴 apache2handler SAPI 作為溝通橋樑。
|----------------------|
| |
| Apache2 |
| ============== | apache2handler ###############
| = PHP Module = <-|-----------------> # PHP Runtime #
| ============== | ###############
| |
|----------------------|
在上圖中
- Apache2 可以被視為一個(或一組)執行緒
- PHP Module 是一個被 Apache 載入的 動態連結函式庫(Dynamic Library)
- PHP Runtime 用於實際執行 PHP 程式,它並非一個實際存在的執行緒,只是一個虛擬概念