PHP 是解釋型腳本語言,無法像 C/C++ 那樣直接編譯為原生機器碼 EXE。但可以通過打包工具將 PHP 解釋器、擴展、腳本文件打包成單一可執行文件,實現「類 EXE」分發。本文梳理主流方案與避坑指南。
| 工具 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| PHPCompiler | 嵌入 PHP 運行時 + 腳本加密 | 早期經典、支持 GTK GUI | 停止更新、僅支持舊 PHP 版本 | 維護極老項目 |
| ExeOutput for PHP | 內置 PHP + Chrome 無頭瀏覽器內核 | 支持現代 Web 技術(HTML5/JS/CSS)、可做桌面端 Web 應用 | 商業收費、體積較大(~30MB+) | PHP 桌面應用、內部工具 |
| PHAR + PHP 運行時 | 打包為 .phar,分發時附帶便攜版 PHP | 原生、免費、體積小 | 需用戶安裝 PHP 或自帶運行時 | 命令行工具、CI/CD 腳本 |
| PeachPie | PHP 編譯為 .NET IL (C#/VB.NET 互調) | 真編譯、高性能、跨平台、可生成原生 EXE (via .NET Native/AOT) | 語法兼容性有限、生態適配中 | 新項目、.NET 生態整合 |
| phpc (php-compiler) | PHP 編譯為 C 代碼再編譯 | 接近原生性能 | 實驗階段、功能不全 | 研究嘗試 |
composer require box-project/box 打包 PHAR,配合 PHP 便攜版 分發(解壓即用)。dl()、線程安全)。// 1. 安裝 Box
composer global require box-project/box --dev
// 2. 編寫 box.json.dist
{
"chmod": "0755",
"directories": ["src", "vendor"],
"files": ["config.php"],
"main": "src/app.php",
"output": "myapp.phar",
"stub": "cli-stub.php",
"compression": "GZ",
"algorithm": "SHA256"
}
// 3. 構建
php -d phar.readonly=0 $(which box) compile
// 4. 分發:將 myapp.phar + PHP 便攜版目錄打包成 zip
// 用戶解壓後運行:php myapp.phar 或 ./myapp.phar (Linux/macOS + chmod +x)
dl() 加載擴展,所需擴展必須編譯進 PHP 運行時或預先在 php.ini 啟用。__DIR__ 而非 phar://。__FILE__ 在 PHAR 中指向封存內部,需用 Phar::running() 獲取真實路徑。.bat 啟動腳本。總結:PHP 不能「編譯成 EXE」,但成熟的打包工具已能滿足絕大多數分發需求。選型核心看目標場景(CLI/GUI/Web)、性能要求、維護成本三個維度。