有一天我在使用 Swoole 写框架的时候意识到这么一个问题,虽然像 Swoole 扩展一样,PHP 很多扩展都能很好的提供一些特性去方便开发者开发和使用,但同时也给一些部署和分发上造成了一定困难:不是每台 Linux 主机和发行版都有 PHP环境,即使有 PHP 环境,也可能没有自己需要的 C 语言写的扩展。那么我们为何不把 PHP 直接编译成像 Go 语言程序那样静态链接的呢?
当然目前研究阶段仅限于把 PHP 解析器本体编译为静态二进制文件,还没有研究怎么把 PHP 代码也编译进去。
于是就有了长达一个多月的折腾,最后终于在 Alpine 发行版上编译成功,其实 PHP 本身如果不带任何扩展,就是 `--disable-all`
的话,是很简单就可以静态编译的,但 PHP 的灵魂就是一堆好用的扩展,没有扩展也没有什么意义。
这次静态编译的研究思路大概是:
- 尽可能使用系统的包管理安装依赖包,如果没有则再手动编译。
- 编译扩展时直接从 pecl 下载,保持版本更新。
- 尽可能地抽象和简化编译流程。
- 自动化下载和编译所有内容。
不过最后为了方便大多数用户在不同操作系统下自己编译 Linux 的静态二进制,我将脚本改为了在 Docker 里运行,这样比如像我这样的老年 Mac 党也可以比较舒适地调整脚本。
最后附上脚本开源地址: