diff --git a/README.md b/README.md
index 8f65e1a7..73a81cfb 100755
--- a/README.md
+++ b/README.md
@@ -97,6 +97,8 @@ file ./php
如果你对以上问题有解决方案,请提出 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`),则可以很方便地静态编译。
+
## 参考资料
-
-