Self-Hosted static-php-cli build action.
This repository is used to automatically compile static-php-cli related content for different architectures and operating systems.
- Archive download sources weekly
- Build PHP - Unix
- Build PHP - Windows
- Extension matrix tests (8.0)
- Extension matrix tests (8.4)
- Build pre-built packages
实际构建入口为本仓库的 Actions → Build Self-Hosted PHP Binary (Unix) → Run workflow。
walkor/static-php-cli 是旧的编译器 fork,本仓库直接检出上游 SPC v3 的固定提交(含本次 PHP 安全版本的 IMAP、Swoole、静态 libpq 兼容修复)。
各分支的完整构建版本与官方源码 SHA-256 统一保存在 .github/php-releases.json,由更新检查自动维护。
PHP 8.1 不再构建或列入支持列表。
所有 Unix CLI 和 micro.sfx 均不包含 intl/ICU,保留原有其余扩展,不提供 intl 变体。Linux CLI 和已发布的 micro.sfx 默认使用固定版本 UPX 5.2.1 --best,macOS 不加壳。ARM64 glibc CLI 遇到该版本 UPX 的加载器边界问题时,保留已通过原生验证的未加壳文件,并在元数据中记录原因。
CI 在加壳前直接检查 ICU 数据、扩展、实际大小(不超过 80 MiB)以及 glibc 2.17 符号基线;加壳后核对完整版本、全部扩展和 TCP 通信,并实际执行 webman 的 build:bin 和打包后的 HTTP 服务。CLI 和 micro.sfx 的加壳前后大小、SHA-256 记录在发布元数据中。
可勾选 validation-only,先仅编译 PHP 8.3 Linux x86_64,比较旧版与新版的实际文件大小、同一 webman 应用的进程树 PSS 内存;此模式不会发布。
Unix 流程编译 Linux 和 macOS 的 x86_64、aarch64,共 16 个组合。
每个任务从 PHP 官方地址重新下载源码,验证官方 SHA-256;编译后核对完整版本号、关键扩展和 TCP socket 通信。
默认勾选 include-glibc,额外生成 glibc 2.17 兼容的 Linux x86_64/aarch64,共 24 个组合。glibc 包以 -glibc.tar.gz 结尾;默认下载文件仍为 musl 全静态版。
完整矩阵会从源码编译大量依赖,macOS 任务可能排队,需等待每个 job 的运行验证完成。
glibc 产物还会通过 ELF 符号检查,确认所需 glibc 不高于 2.17。
所有选定组合通过后才合并产物,调用可复用的 Publish static PHP workflow,使用已有 DEPLOY_SERVER_SECRET_KEY 上传服务器。
发布经过 workerman.net 连接下载机 ubuntu@10.0.24.5,目标固定为 /home/www/download.workerman.net/public/php/;不再依赖过期的 HOST、USER、PORT、TARGET secrets。
服务器在每次上传前,将原下载目录保存到公开目录之外的 /home/www/php-release-backups/<UTC时间>-<PID>/。备份使用硬链接,发布使用私有暂存目录和原子替换,最后更新版本 JSON。
部署公钥在网关上仅可连接下载机 SSH 端口,在下载机上仅可写入 PHP 下载目录,不能启动 shell、执行上传文件或删除下载文件。正式发布由下载机经 HTTPS 拉取经过校验的 GitHub artifact,SSH 只传短效下载清单,避免跨境 SSH 大文件传输超时;保留兼容 rrsync 接口。
SSH 主机公钥固定在 .github/php-deploy-known-hosts,连接配置位于 .github/php-deploy-ssh-config。
Actions artifacts 同时保留压缩包、SHA-256、扩展列表和版本 JSON。
上传后会通过公开下载地址再次核对每个包的校验文件与版本 JSON,避免上传目标或缓存错误导致页面仍提供旧版本。
macOS 使用 macos 文件名,同时提供兼容旧安装脚本的 mac 别名。
Linux x86_64 继续发布 php8.x、php8.x.micro.sfx 与对应 ZIP。
使用 PHP 8.3.36 Linux x86_64 musl 无 intl 产物和 UPX 5.2.1 --best,试验通过后,正式 Linux 包及后续每周更新采用该配置。
| 文件 | 加壳前 | 加壳后 |
|---|---|---|
| CLI | 63,337,528 B | 19,522,892 B |
| micro.sfx | 63,195,416 B | 19,482,480 B |
| 同一 webman 应用 | 66,809,311 B | 23,096,375 B |
| micro.sfx ZIP | 22,654,519 B | 19,109,200 B |
CLI 的版本、完整扩展列表和 UPX 完整性检查通过;micro 在加壳后按 SPC 的补丁 截去尾段,再附加同一份 PHAR,实际启动并验证 HTTP 响应。 在同一服务器交替运行三次,8 个业务 worker(含 master、monitor 共 10 个进程)的进程树 PSS 中位数为 66,449 → 85,469 KiB,HTTP 就绪时间中位数为 87.45 → 330.70 ms。 UPX 明显缩小磁盘文件;本次测试运行内存增加约 18.6 MiB。以上数据仅代表这个 PHP 版本、平台和测试应用。
四个正式 Linux x86_64 打包运行时均通过原生 PHP 和实际 webman HTTP 检查。下表为磁盘文件大小,MB 按 1,000,000 字节计算;webman 列使用同一示例应用:
| PHP | 原含 intl 的 micro | 去除 intl、未加壳 micro | UPX micro | UPX webman 程序 |
|---|---|---|---|---|
| 8.2.35 | 96.86 MB | 62.13 MB | 19.41 MB | 23.02 MB |
| 8.3.36 | 97.96 MB | 63.20 MB | 19.48 MB | 23.10 MB |
| 8.4.27 | 101.03 MB | 66.25 MB | 20.31 MB | 23.92 MB |
| 8.5.12 | 108.32 MB | 70.39 MB | 20.76 MB | 24.37 MB |
如已完成无 intl 的源码构建,可使用 Pack existing Linux PHP with UPX,填入原构建 run ID,复用原始 Linux 产物加壳,保留 macOS 包。发布要求原构建的全部 24 个 PHP 编译任务成功,并等待原发布进程结束;原上传失败或取消时也能复用已验证的产物。随后验证并发布完整 24 个组合,避免旧发布覆盖 UPX 文件。
UPX 5.2.1 的 ARM 加载器在可执行段末页没有 8 字节跳转空间时存在内部断点。此前通过原生 gdb/strace 在 PHP 8.4.27 ARM64 glibc 构建中定位到这个布局,兼容分支允许记录 packing=none、packing_reason=upx-5.2.1-arm64-hatch 并保留经过原生验证的文件。2026-10-29 的 JIT 修复构建改变了二进制布局,本轮全部 16 个 Linux CLI 和四个 x86_64 打包运行时均已通过 UPX 原生检查并发布。后续版本仍重新检查布局,必要时使用上述兼容分支;每周检查识别该策略,避免反复编译。
正式构建显式使用 --disable-swoole-stdext。stdext 是 Swoole 的实验性功能,注册的 opcode handlers 会导致 PHP 在启动时禁用 JIT;关闭它不移除 Swoole 核心功能。PHP 8.2/8.3 的静态对照测试证明不需要额外修改协程 exit() 钩子。
PHP 8.5 在本次 Zig 0.17 构建中会自动选择 TAILCALL VM;关闭 stdext 后,完整静态包仍可在 JIT 与协程测试中崩溃或执行错乱。PHP 上游记录了 TAILCALL VM 的 opcode handler 执行帧问题。构建时通过 SPC_EXTRA_PHP_VARS=php_cv_preserve_none=no 选择传统 VM,保留 --enable-opcache-jit,避免更改 PHP 核心或 Swoole 的退出钩子。
构建流程检查 CLI 的 tracing/function JIT 是否实际生成机器码,并对比关闭 JIT 时的整数、浮点结果;还检查协程 channel、异常、跨 yield 的错误抑制、TCP、协程 exit() 和普通 CLI 退出状态。Linux 加壳后重跑 JIT 检查,PHP 8.5 还必须通过原始崩溃复现脚本。micro 保持原有 OPcache 默认关闭的配置,单独验证协程和实际 webman 打包 HTTP 服务;不能把 CLI 的 JIT 结果当成 micro 开启 OPcache/JIT 的兼容承诺。
定向隔离测试使用完整扩展列表、Linux x86_64 musl 和真正的 Windows/WSL2。关闭 stdext 需要重新编译 CLI 和 micro,不能只修改 INI 或重新 UPX。正式发布要求选定平台全部构建和运行验证通过,再备份并替换下载站包。
验证记录:PHP 8.2.35 / 8.3.36 / 8.4.27 的 Linux、UPX、webman 和 WSL2 测试,PHP 8.5.12 传统 VM、原始崩溃样例和 WSL2 测试,均已通过。2026-10-29 的全量构建与发布已覆盖全部 24 个 Linux musl/glibc、macOS、x86_64/aarch64 组合,并备份、替换下载站文件。外网全部 24 个压缩包和 8 个 macOS 文件名别名均已实际下载并核对 SHA-256;CLI、micro 原文件及 ZIP 也通过发布后的公开校验。
实际公开下载包的 WSL2 回归已通过,覆盖四个 PHP 分支的 tracing/function JIT 机器码、协程、PHP 8.5 原始崩溃样例和 micro 原有默认配置。网站安装脚本已恢复 opcache.jit=tracing、opcache.jit_buffer_size=64M,其 Ubuntu 和真实 WSL2 测试也验证了四个分支按生成的 INI 启动无警告、缓存有效并实际生成 JIT 机器码。
Check PHP releases weekly 在每周一北京时间 04:23(UTC 周日 20:23)检查,也可手动 Run workflow。 检查运行在 GitHub,不需要本地电脑开机。使用 PHP 官方 release JSON API,分别读取 8.2、8.3、8.4、8.5 的最新正式版及 tar.gz 的 SHA-256,不采用 RC/开发版,不自动增加新的 PHP 分支。 与下载站全部 24 个 Linux/macOS 包的实际版本及构建配置比较;没有新版、包齐全且无 intl、UPX、JIT 修复标记均满足当前要求时,跳过构建和上传,不产生版本提交。旧包缺少当前修复标记时会补建一次;本轮发布后已确认检查结果为无需构建或上传。 有新版时自动提交版本清单,并触发包含 musl、glibc 2.17、macOS 的完整 Unix 构建、验证和发布流程;上传前仍会备份旧下载文件。 以上定时任务维护下载站的静态 PHP 包。Windows 保持手动构建;业务服务器的运行中 PHP 仍按需单独升级。 如果上次编译或发布失败,即使清单已经提交了新版本,下次仍会根据下载站实际版本重试;已有构建或发布运行中时暂缓,避免重复任务。 官方数据异常、校验和发生意外变化或检测到版本回退时,检查会失败并保留现有下载文件。
手动指定版本时,修改 .github/php-releases.json 的 version、sha256(来自 https://www.php.net/downloads.php),再运行 Unix 构建。Windows 也读取同一清单。
不要恢复以前仅按 8.x 缓存的 PHP 源码,以免把旧漏洞版本再次发布。
失败时查看对应 job 的 Download/Build 日志与 logs-* artifact。网络等临时错误可重新运行失败任务;修改 workflow 或编译器提交后,必须重新 Run workflow,使新提交生效。发布 job 会等待全部编译通过。
如果编译已通过、仅上传失败,可打开 Actions → Publish static PHP → Run workflow,
填入原构建的 run ID 和包数量(含 glibc 为 24,否则为 16),直接重试上传,无需重新编译。产物保留 30 天。
部署公钥可在 Configure restricted SSH deployment 步骤查看;服务器授权入口位于 .github/scripts/receive-static-php-rsync.py,HTTPS 接收器为 .github/scripts/receive-static-php-pull.py,两者安装到 /usr/local/libexec/ 并由 root 持有。接收器仅接受 GitHub 官方 artifact 存储域名,核对整个 artifact 和每个 PHP 文件的 SHA-256、文件名、版本及扩展清单,备份后才替换公开文件;不会运行上传的代码。
上线后检查 https://download.workerman.net/php/list 与 https://www.workerman.net/download,
并在对应系统解压运行 ./php -n -v、./php -n -m。
站点安装脚本来自 webman-php/workerman.net 的 app/controller/Download.php。
编译器固定 libevent 2.1.13-stable(含 2026-07 安全修复)与 event 3.1.6,避免自动选择标记不准确的 libevent alpha 版。 event 使用上游 Bitbucket 的 3.1.6 源码并验证 SHA-256;PECL 多版本目录压缩包会破坏 PHP 静态构建的扩展头文件生成。