找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4664

积分

0

好友

606

主题
发表于 3 小时前 | 查看: 6| 回复: 0

TypePHP v0.7 版本新增了 --full-static 参数,可以把 PHP 应用编译成不依赖任何外部库ELF 可执行文件,直接复制到任意一台 Linux 机器上就能运行。

对商业项目来说,这会显著降低交付与部署的复杂度。无论客户用的是老旧的 CentOS,还是 RedHatUbuntuDebian,甚至是 Alpine Linux,都可以免去安装依赖的步骤,上传文件即可执行。

普通构建与全静态版对比

项目 普通构建 全静态版
体积 54 KB 151 MB
共享库依赖 52 个 0 个
任意机器能跑
启动耗时 40 ms 40 ms

可以看出,全静态版虽然体积明显变大,但换来了真正的零依赖交付。而启动耗时并没有明显增加,对多数场景来说几乎无感。

1. 准备 SDK

SDK 内含全静态编译所需的 libphp.alibphpx.a 以及全部头部文件。其中 libphp.a 已经达到 294 MB,合并了 PHP 内核、libcurlOpenSSLC++ 运行时和 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 只是未压缩体积。实际交付时,可以使用 stripupx 对二进制文件做瘦身,再打入 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 技术栈的团队来说,这类「一次编译、多机运行」的能力,往往能在实际项目中省去不少部署和排查环境问题的时间。




上一篇:Agent 发布如何避免用户报错?从版本混跑到可恢复体验的落地拆解
下一篇:Uber遇到了自己的Uber:Robotaxi与Waymo冲击下平台还值多少钱
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-9-6 07:12 , Processed in 0.785720 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表