周末测试了下把一些扩展编译 so 的过程改成多段构建(先不管为什么),最后一步是 FROM php:fpm-alpine
然后 COPY --from=0 /path/to/so /path/to/so
。结果意外发现,这样搞比 FROM phpswoole:8.1-alpine
当底的镜像,最终成包多了 30M 左右。
于是就单独起了个 fpm-alpine 的容器自己操下载源码安装,在默认的情况下,最终出来的 so 是 34M ,但是 phpswoole:8.1-alpine (有开 http2/json 等其他选项) 里的 so 只有 2.8M ,再根据 swoole 官方的 Dockerfile ,自己在 fpm-alpine 的容器里执行了下,全部默认的情况下,只有 2.4M 。
也就是说。在同一份源码的情况下,用 docker-php-source && docker-php-ext-configure && docker-php-ext-install
比自己 phpize && configure && make
最后出包要少 30M 。再次尝试了下 pecl install swoole
的一键安装方案,结果出来的 so 和自己编译的一样,34M 。
小弟对 PHP 底层这块确实了解不多,请问老哥们有什么头绪么。如果 docker-php-ext-x 系列函数有什么特殊优化,那不是应该所有扩展都用它装么,为啥 swoole 官方依然选择了 pecl 安装 redis 扩展呢。还是 swoole 这个扩展本身有什么玄机?
1
julyclyde 2022-09-27 08:52:36 +08:00
从机制上讲:你 copy 的不一定是齐全的
大部分 pecl 都只是“某个库的 PHP 语言 binding” 你只 copy 过来这个 binding 文件是没法用的 |
2
littlezzll 2022-09-28 08:55:26 +08:00 via Android
docker-php-ext-xx 本质上还是编译的 shell 脚本,打开看看怎么写的就知道了,包含了加入 ini 配置和删除源码的步骤,还有别的一些操作,pecl 编译完我记得 /tmp 存的还有东西的
|