mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-18 21:04:52 +08:00
Update README.md
This commit is contained in:
parent
5a47243022
commit
5e33b0d84a
28
README.md
28
README.md
@ -97,6 +97,8 @@ file ./php
|
|||||||
|
|
||||||
如果你对以上问题有解决方案,请提出 Issue 或 PR!
|
如果你对以上问题有解决方案,请提出 Issue 或 PR!
|
||||||
|
|
||||||
|
如果你对此脚本比较感兴趣,未来会在此编写脚本中涉及内容的解析和说明。
|
||||||
|
|
||||||
## 运行示例
|
## 运行示例
|
||||||
编译后的状态
|
编译后的状态
|
||||||
|
|
||||||
@ -106,6 +108,32 @@ file ./php
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## 原理
|
||||||
|
静态编译是一项比较多见于 Golang 的编译方式,在传统的 Linux 系统下,正常的程序和库基本是动态编译链接(Dynamically linked)的,也就是说,不同程序引用同样的库可以共用,减少资源重复。
|
||||||
|
|
||||||
|
但是由于不少系统软件环境配置复杂,或者依赖的库版本冲突,一般使用 Docker 等容器技术可以解决这一问题。但 Docker 等容器也需要拉取镜像,体积较大,对于程序有便携需求的人(比如网络安全员做渗透测试等)需要很多程序可以像 Windows 上的绿色程序一样随处打包运行。
|
||||||
|
|
||||||
|
PHP 是最好的编程语言,它编写容易,易于部署和开发,倘若将 PHP 编译为静态的文件,并且将 Swoole 或 libevent 等库同样内嵌,那 PHP 不仅将可以编写便携的 Web 服务器,还能做很多想不到的事!
|
||||||
|
|
||||||
|
编译静态 PHP 大致分为以下几个步骤:
|
||||||
|
1. 下载 PHP 源码
|
||||||
|
2. 下载需要静态编译的额外扩展源码(如 inotify、mongodb、redis 等)
|
||||||
|
3. 将额外扩展源码放入 PHP 源码中
|
||||||
|
4. 生成 `configure` 并使用 `-static` 的 FLAG 进行生成 makefile
|
||||||
|
5. 修改 Makefile 中的编译参数,增加 `-all-static` 和去掉 dynamic 相关的参数
|
||||||
|
6. 使用 `make` 构建静态 PHP
|
||||||
|
7. 使用 `make install` 安装到指定目录,再使用 `strip` 去除符号表缩小体积
|
||||||
|
|
||||||
|
对于第二步,如果额外扩展中有依赖 Linux 的其他库(比如 curl 依赖 libcurl),则需要在第二步之前编译安装对应库的静态版本(比如 libxml2.a)
|
||||||
|
|
||||||
|
而此处出问题最多的部分就是安装额外扩展的依赖上,很多库不支持静态编译,而互联网很难找到对对应库进行静态编译的资料。
|
||||||
|
|
||||||
|
脚本和 Dockerfile 统一采用 Alpine 的目的就是,apk 包管理下有很多库提供了 `*-static` 静态版本,直接使用包管理安装就可以使用,而即使没有,也可以使用 musl-libc 进行静态编译,避免 glibc 下的 `libnss` 等无法静态编译的问题。
|
||||||
|
|
||||||
|
第二种要面对比较棘手的问题就是 PHP 扩展可能本身不支持静态编译(如 curl 扩展),有些通过绕过手段可以静态编译,但有些只能通过对扩展源码进行修改才能使其支持。
|
||||||
|
|
||||||
|
所以这个项目中涉及的脚本,最大的问题就在于对其他依赖的处理,而不是 PHP 编译本身。PHP 如果不启用任何扩展(即使用 `--disable-all`),则可以很方便地静态编译。
|
||||||
|
|
||||||
## 参考资料
|
## 参考资料
|
||||||
- <https://blog.terrywh.net/post/2019/php-static-openssl/>
|
- <https://blog.terrywh.net/post/2019/php-static-openssl/>
|
||||||
- <https://stackoverflow.com/a/37245653>
|
- <https://stackoverflow.com/a/37245653>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user