静态编译 PHP 二进制,目前支持 Linux、macOS、FreeBSD

crazywhalecc

鉴于之前的老版本是纯 Bash 写的,扩展性不是很好,而且里面的库、扩展无法及时使用最新版,所以一怒之下重写了整个编译项目。新版本支持旧版本的所有扩展,同时也新增了很多扩展。

https://github.com/crazywhalecc/static-php-cli

新版本可以手动本地在 Linux(Debian、Ubuntu、RHEL、CentOS 等主流发行版)、Alpine Linux、macOS、FreeBSD 下构建,也可以在 GH Action 手动触发构建。同时支持了一些新的特性:

  • 目前支持至少 60 种扩展。
  • 支持扩展依赖和特性选择功能,例如你可以随意组合使用扩展和依赖库,例如 gd 库可选增加 libwebp 等功能。
  • 支持构建新的 SAPI(现在支持构建 climicrofpmembed)。
  • 支持构建线程安全版本(使用 --enable-zts)。
  • 支持在编译前硬编码 INI 选项到二进制中。
  • micro 支持在编译时启用伪装 cli 模式。
  • 新增自动检查编译环境是否合格模块,可自动在 Debian、macOS、Ubuntu 等系统安装需要的编译工具。
  • 更多新扩展,例如:pgsqlsnappyswowapcu 等,详见 支持扩展列表

目前测试了下 Workerman 和 webman 项目都可以正常构建和运行。

文档:https://static-php.dev/zh/

3213 20 11
20个评论

walkor

太好了,非常感谢你的项目,非常棒

abinx

可以增加oracle和SqlServer的扩展吗

  • crazywhalecc 2023-05-02

    这个很困难了,因为目前编译的是都支持 in-tree 构建的扩展,而扩展本身也不能依赖不开源的第三方库(除非依赖库提供静态链接的库 .a)。

  • crazywhalecc 2023-12-24

    我来挖坟了:sqlsrv扩展最新的分支已经支持了。

luohonen

windows还没支持么

  • crazywhalecc 2023-05-15

    Windows不是Unix系统,需要用到一套全新的工具链,且很多扩展没办法直接提供支持。所以写起来比较麻烦一点。

li914

大大牛皮

  • 暂无评论
ersic

大佬,什么可以减少打包后体积的方法吗?

  • crazywhalecc 2023-05-18

    如果是二进制本身,那现在已经做了一定程度的优化了,包括strip、-Os等优化。如果是后面跟着的phar归档,可以在添加时对每个文件去除空格的方式来减少。目前micro打了phar补丁也可以采用gzip方式压缩体积,但不确定会不会有bug。

  • ersic 2023-05-18

    好的,感谢回复。

luscio

mac编译curl扩展报错了
[00:22:52] [CRIT] Build failed with SPC\exception\RuntimeException: Command run failed with code[2]: cd '/Users/linyangbin/static-php-cli/source/php-src' && make -j8 EXTRA_CFLAGS="-g -Os -fno-ident" EXTRA_LIBS="-framework CoreFoundation -framework SystemConfiguration /Users/linyangbin/static-php-cli/buildroot/lib/libcurl.a /Users/linyangbin/static-php-cli/buildroot/lib/libz.a -lresolv" cli 1>/dev/null 2>&1
[00:22:52] [CRIT] Please check with --debug option to see more details.

  • crazywhalecc 2023-05-20

    如果是 GitHub Action 构建,建议先删除 Action Cache,并且 sync fork 后再编译。如果是本地编译,git pull 更新项目后,删除 sourcedownloadsbuildroot 目录后再次构建。因为近期 curl 发布了 8.1.0 新版本,增加了编译过程中对 argv 的检查,而默认本项目对 CMake 项目使用了交叉编译的参数,导致检查无法正常进行。最近一次也修复了这个问题,但需要清除旧的编译数据。(source 目录保存的是编译源码目录,buildroot 保存的是编译目标文件,downloads 保存的是依赖库下载压缩包)

  • luscio 2023-05-23

    mongodb扩展不行?

  • crazywhalecc 2023-05-23

    mongodb可以啊,是有啥报错吗,在你那边编译

artisan

👍

  • 暂无评论
luscio


mongodb扩展,mac本地编译和 GitHub Action 构建都会报错

  • crazywhalecc 2023-05-26

    这周修复。

  • crazywhalecc 2023-05-29

    这个问题和mongodb官方的驱动代码有关,它没有提供几个可选库的禁用编译参数选项,而且它默认会搜索系统路径无法忽略,以至于在configure阶段认为有库,在link阶段找不到libxxx.a的库从而导致报错。已向mongodb库提Issue,如果近期无法解决,我先会patch资源让它禁用掉。

tanhongbin

大佬,打包php8.1版本 cli启动有 zend_mm_heap corrupted 错误,不知道是什么导致的

  • crazywhalecc 2023-05-26

    是 Action 编译的还是本地编译的?如果是本地的话,每次编译完最好删除 source 和 buildroot 目录再进行新的编译,有时候在不同扩展下多次编译会出现这种情况。如果这样还能稳定复现的话,麻烦提供一下编译的命令和编译出来的二进制文件。

  • tanhongbin 2023-05-26

    是php版本的问题,8.1.15 就会有,8.1.19就没有,换一个版本就好了

zhqing

如何添加自定扩展?比如swoole_loader

  • kspade 2023-06-07

    不可能的别想了,一切的扩展 so 都不可能被加载 (除非mac系统)

wekyun

牛逼大佬

  • 暂无评论
touer

打包出来的micro.sfx与webman.phar结合成一个文件后,运行提示:Only run in command line mode;

  • touer 2023-08-01

    打印PHP_SAPI的值等于micro

  • artisan 2023-08-06

    选择名称含有cli的sfx文件试试

  • touer 2023-08-07

    buildroot/bin目录下只有一个micro.sfx,没看到有其他的

  • artisan 2023-08-07

    直接下载的选择micro_cli.sfx

  • artisan 2023-08-07

    dixyes/lwmbs 这个项目的discussions里的FAQ里咨询过作者,micro.sfx、micro_cli.sfx的区别(后者SAPI name为cli),不知道crazywhalecc/static-php-cli的作者是否也是一致的处理方式

  • crazywhalecc 2023-08-08

    目前 static-php-cli 编译的 phpmicro 没开启 sapi 转换,也就是 -DPHP_MICRO_FAKE_CLI 这个编译选项。主要是这个选项虽然省事但是入侵了原有的 SAPI,不考虑使用这种方式。如果可能的话,修改 PHP 代码中判断 SAPI 的逻辑是更好的一劳永逸解决方案。

  • touer 2023-08-09

    改代码的话好多地方都要改,而且要改webman框架里面的代码,有点麻烦

  • walkor 2023-08-09

    下个版本workerman做下兼容,允许 micro 运行

  • kspade 2023-08-09

    micro 最不爽的地方就是目前不支持一些第三方 so 二进制扩展比如:sow sg13 14 以及自己定义的一些加密扩展

  • artisan 2023-08-09

    php的扩展或者compsoer包是否也有检测当前环境sapi name是否为cli的情况?

  • crazywhalecc 2023-08-09

    我后面还是加个编译参数吧,毕竟可选更好一点。但默认还会是 micro。另外 composer 包应该有检测 sapi 环境的,但这个得看扩展对应的代码了,一般 composer 扩展都是通用 fpm、cli 所以单独判断的不多。

  • touer 2023-08-11

    我看了有其他compsoer包也有检查PHP_SAPI

  • kspade 2023-09-18

    预算1000人民币
    找人给static-php-cli 增加一个 加密代码的扩展 能不能搞

mon

厉害

  • 暂无评论
mewchen

牛逼,这样子可以相对更轻松的用K8s跑php了!

  • tanhongbin 2023-08-16

    大佬 你们为啥都这么卷啊,php 都上k8s

  • 小W 2023-09-19

    PHP怎么卷也还是PHP[斜眼]

  • kspade 2023-09-19

    项目的成败和语言无关,在编程圈很多人不看好PHP可是不论你baidu 还是gg,随便搜索各种关键词,你会发现80%的搜索关键词结果:至少得有50%以上的网站都是PHP语言的

软饭工程师

截图
你好,请问我这个是什么原因呢,嘤特尔的mac ,下载的是这个文件,https://dl.zhamao.xin/static-php-cli/php-8.0.28-cli-linux-x86_64.tar.gz ,执行报错


使用这个命令编译常用扩展的micro.sfx文件就报错,是什么情况嘞
bin/spc build --build-micro "bcmath,calendar,ctype,curl,dba,dom,exif,filter,fileinfo,gd,iconv,mbstring,mbregex,mysqli,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,readline,redis,session,simplexml,sockets,sqlite3,tokenizer,xml,xmlreader,xmlwriter,zip,zlib" --debug

tanhongbin

ERROR: failed to solve: process "/bin/sh -c composer update --no-dev" did not complete successfully: exit code: 2
Unable to find image 'cwcc-spc-x86_64:latest' locally
docker: Error response from daemon: pull access denied for cwcc-spc-x86_64, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
Error: Process completed with exit code 125.
大佬,现在报错了 actons构建的时候,应该是镜像没了 或者没有权限了

  • 暂无评论
happy321

请问这个可以当做PHP的源码加密来使用吗? 反向解密容易吗

= - =

有静态的 php 单文件吗。想要下载使用。

dot

nihao 可以编译php7.3 f p m吗

  • dot 2023-10-15

    发个评论这么难,总是敏感,也不知道什么敏感

  • dot 2023-10-15

    我编译了几天都搞不定啊,网路 环境又不好,特意申请了外 编译,也是不成功,好不容易把文件下载本地,编译也不成功

  • kspade 2023-10-15

    他那个我都是搞了好多次都没编译成功 docker 都不好使 毛病太多了

  • dot 2023-10-15

    目前急需一个7.3的fpm,docker安装php运行太慢,很奇怪,项目又是老项目所以急需一个绿色版的fpm,我看作者编译了8.0fpm,希望能抽空把7.x的编译一下,不用经常编译,有一个能用的版本就行了

  • kspade 2023-10-15

    似乎这玩意只支持8.0 +

  • dot 2023-10-15

    看文档说明支持7.3哦

  • crazywhalecc 2023-10-16

    编译7.3的话得看你加了什么扩展。我这边只加五六个常用扩展是可以编译7.3的fpm的。

  • crazywhalecc 2023-10-16
    # 测试环境:Debian 11 x86_64
    bin/spc download --all --debug --with-php=7.3
    bin/spc build bcmath,openssl,curl,phar,posix,pcntl --build-fpm --debug
  • crazywhalecc 2023-10-16

    如果本地环境有问题最好提Issue,也许是系统原因。因为我只在页面上提到的发行版和系统测试过,不确定其他系统环境能否正常编译。文档提到的老版本不完美支持,就是很多外部扩展(比如mongodb、protobuf、swoole等)不支持老版本的PHP。PHP本身内置的扩展和一些常见的扩展都是可以编译的。

  • dot 2023-10-16

    我尝试只加入mysqli可以编译成功,尝试加一个点常用扩展就不成功

  • crazywhalecc 2023-10-16

    你编译了哪些扩展?

crazywhalecc

400
积分
0
获赞数
0
粉丝数
2023-04-30 加入
🔝