TypePHP v0.7 版本新增了 --full-static 参数,可以把 PHP 应用编译成不依赖任何外部库的 ELF 可执行文件,直接复制到任意一台 Linux 机器上就能运行。
对商业项目来说,这会显著降低交付与部署的复杂度。无论客户用的是老旧的 CentOS,还是 RedHat、Ubuntu、Debian,甚至是 Alpine Linux,都可以免去安装依赖的步骤,上传文件即可执行。
普通构建与全静态版对比
| 项目 |
普通构建 |
全静态版 |
| 体积 |
54 KB |
151 MB |
| 共享库依赖 |
52 个 |
0 个 |
| 任意机器能跑 |
❌ |
✅ |
| 启动耗时 |
40 ms |
40 ms |
可以看出,全静态版虽然体积明显变大,但换来了真正的零依赖交付。而启动耗时并没有明显增加,对多数场景来说几乎无感。
1. 准备 SDK
SDK 内含全静态编译所需的 libphp.a、libphpx.a 以及全部头部文件。其中 libphp.a 已经达到 294 MB,合并了 PHP 内核、libcurl、OpenSSL、C++ 运行时和 musl libc,并内置 38 个常用 PHP 扩展。
可以直接从 phpx Release 页面下载编译好的版本,地址:https://github.com/swoole/phpx/releases
cd /path/to/typephp
curl -L -O https://github.com/swoole/phpx/releases/download/v2.6.13/phpx-full-static-sdk-v2.6.13_php8.4.25-linux-x64.tar.xz
tar -xJf phpx-full-static-sdk-v2.6.13_php8.4.25-linux-x64.tar.xz
ln -s $(pwd)/swoole-cli-sdk-v6.2.2-php8.4.25-linux-x64 phpx/full-static/sdk
TypePHP 只识别 phpx/full-static/sdk 这一个路径。另外,全静态编译当前只支持 clang,因此需要提前安装 clang 并在编译时显式指定编译器。
如需自行编译全静态版 SDK,可参考 https://github.com/swoole/swoole-cli/blob/main/docs/sdk.md
2. 编译
下面是一段简单的 app.php 示例:
<?php
function main(): void
{
echo "Hello World!";
var_dump(PHP_VERSION);
var_dump(php_uname());
global $argv;
var_dump($argv);
$date = date('Y-m-d H:i:s', time());
var_dump($date);
}
使用如下命令进行全静态编译:
tpc app.php --full-static --compiler=/usr/bin/clang
3. 运行
编译完成后,可以通过以下命令验证文件类型和依赖情况:
$ file app
app: ELF 64-bit LSB executable, x86-64, ..., statically linked, ...
$ ldd app
不是动态可执行文件
$ readelf -dW app | grep -E 'NEEDED|INTERP'
$ # 空的,表示没有任何依赖
ll -h app
-rwxrwxr-x 1 swoole swoole 151M 9月 4 10:21 app*
可以看到,最终生成的可执行文件已经不再依赖任何动态库。文件体积较大的原因在于它包含了所有依赖库、PHP 本身以及相关扩展。
这里的 151 MB 只是未压缩体积。实际交付时,可以使用 strip 或 upx 对二进制文件做瘦身,再打入 tar.gz 压缩包,体积通常可以进一步降到 60 MB 左右。
有一点值得特别说明:经过 TypePHP 编译后,生成的文件并不会包含任何原始 PHP 代码。源码已经被编译为机器指令,因此无需担心代码被直接查看或窃取。
运行结果如下:
$ ./app
Hello World!string(6) "8.4.14"
string(105) "Linux swoole-26 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC x86_64"
array(1) {
[0]=>
string(7) "./hello"
}
string(19) "2026-09-04 02:21:39"
如果你也在做 PHP 命令行工具或后端服务的交付分发,全静态编译是一个很实用的方向。对 PHP 技术栈的团队来说,这类「一次编译、多机运行」的能力,往往能在实际项目中省去不少部署和排查环境问题的时间。