鉴于之前的老版本是纯 Bash 写的,扩展性不是很好,而且里面的库、扩展无法及时使用最新版,所以一怒之下重写了整个编译项目。新版本支持旧版本的所有扩展,同时也新增了很多扩展。
https://github.com/crazywhalecc/static-php-cli
新版本可以手动本地在 Linux(Debian、Ubuntu、RHEL、CentOS 等主流发行版)、Windows、Alpine Linux、macOS、FreeBSD 下构建,也可以在 GH Action 手动触发构建。同时支持了一些新的特性:
cli
、micro
、fpm
、embed
)。--enable-zts
)。cli
模式。pgsql
、snappy
、swow
、apcu
等,详见 支持扩展列表。目前测试了下 Workerman 和 webman 项目都可以正常构建和运行。
太好了,非常感谢你的项目,非常棒
望尔等项背
可以增加oracle和SqlServer的扩展吗
这个很困难了,因为目前编译的是都支持 in-tree 构建的扩展,而扩展本身也不能依赖不开源的第三方库(除非依赖库提供静态链接的库 .a)。
我来挖坟了:sqlsrv扩展最新的分支已经支持了。
大佬 oracle也支持一下呗 商业产品一般都是oracle的比较多
Windows 和 macOS 环境下可以尝试动态加载 oracle 扩展和库。总的来说不可以静态编译 oracle 扩展的原因是 oracle 数据库 oracle 官方没有提供编译的源码或者供静态编译的 ar 文件,所以没有办法编译到 PHP 内,只能采用外部扩展的方式。
windows还没支持么
Windows不是Unix系统,需要用到一套全新的工具链,且很多扩展没办法直接提供支持。所以写起来比较麻烦一点。
大佬,windows能支持下curl吗
支持了 已经不少了
大大牛皮
大佬,什么可以减少打包后体积的方法吗?
如果是二进制本身,那现在已经做了一定程度的优化了,包括strip、-Os等优化。如果是后面跟着的phar归档,可以在添加时对每个文件去除空格的方式来减少。目前micro打了phar补丁也可以采用gzip方式压缩体积,但不确定会不会有bug。
好的,感谢回复。
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.
如果是 GitHub Action 构建,建议先删除 Action Cache,并且 sync fork 后再编译。如果是本地编译,git pull 更新项目后,删除
source
,downloads
,buildroot
目录后再次构建。因为近期 curl 发布了 8.1.0 新版本,增加了编译过程中对 argv 的检查,而默认本项目对 CMake 项目使用了交叉编译的参数,导致检查无法正常进行。最近一次也修复了这个问题,但需要清除旧的编译数据。(source 目录保存的是编译源码目录,buildroot 保存的是编译目标文件,downloads 保存的是依赖库下载压缩包)mongodb扩展不行?
mongodb可以啊,是有啥报错吗,在你那边编译
👍
mongodb扩展,mac本地编译和 GitHub Action 构建都会报错
这周修复。
这个问题和mongodb官方的驱动代码有关,它没有提供几个可选库的禁用编译参数选项,而且它默认会搜索系统路径无法忽略,以至于在configure阶段认为有库,在link阶段找不到libxxx.a的库从而导致报错。已向mongodb库提Issue,如果近期无法解决,我先会patch资源让它禁用掉。
大佬,打包php8.1版本 cli启动有 zend_mm_heap corrupted 错误,不知道是什么导致的
是 Action 编译的还是本地编译的?如果是本地的话,每次编译完最好删除 source 和 buildroot 目录再进行新的编译,有时候在不同扩展下多次编译会出现这种情况。如果这样还能稳定复现的话,麻烦提供一下编译的命令和编译出来的二进制文件。
是php版本的问题,8.1.15 就会有,8.1.19就没有,换一个版本就好了
如何添加自定扩展?比如swoole_loader
不可能的别想了,一切的扩展 so 都不可能被加载 (除非mac系统)
牛逼大佬
打包出来的micro.sfx与webman.phar结合成一个文件后,运行提示:Only run in command line mode;
打印PHP_SAPI的值等于micro
选择名称含有cli的sfx文件试试
buildroot/bin目录下只有一个micro.sfx,没看到有其他的
直接下载的选择micro_cli.sfx
dixyes/lwmbs 这个项目的discussions里的FAQ里咨询过作者,micro.sfx、micro_cli.sfx的区别(后者SAPI name为cli),不知道crazywhalecc/static-php-cli的作者是否也是一致的处理方式
目前 static-php-cli 编译的 phpmicro 没开启 sapi 转换,也就是
-DPHP_MICRO_FAKE_CLI
这个编译选项。主要是这个选项虽然省事但是入侵了原有的 SAPI,不考虑使用这种方式。如果可能的话,修改 PHP 代码中判断 SAPI 的逻辑是更好的一劳永逸解决方案。改代码的话好多地方都要改,而且要改webman框架里面的代码,有点麻烦
下个版本workerman做下兼容,允许 micro 运行
micro 最不爽的地方就是目前不支持一些第三方 so 二进制扩展比如:sow sg13 14 以及自己定义的一些加密扩展
php的扩展或者compsoer包是否也有检测当前环境sapi name是否为cli的情况?
我后面还是加个编译参数吧,毕竟可选更好一点。但默认还会是 micro。另外 composer 包应该有检测 sapi 环境的,但这个得看扩展对应的代码了,一般 composer 扩展都是通用 fpm、cli 所以单独判断的不多。
我看了有其他compsoer包也有检查PHP_SAPI
预算1000人民币
找人给static-php-cli 增加一个 加密代码的扩展 能不能搞
厉害
牛逼,这样子可以相对更轻松的用K8s跑php了!
大佬 你们为啥都这么卷啊,php 都上k8s
PHP怎么卷也还是PHP[斜眼]
项目的成败和语言无关,在编程圈很多人不看好PHP可是不论你baidu 还是gg,随便搜索各种关键词,你会发现80%的搜索关键词结果:至少得有50%以上的网站都是PHP语言的
你好,请问我这个是什么原因呢,嘤特尔的mac ,下载的是这个文件,https://dl.zhamao.xin/static-php-cli/php-8.0.28-cli-linux-x86_64.tar.gz ,执行报错
试试 xxx-macos-aarch64.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
先执行
bin/spc doctor
看看有什么问题?我改用Actions 构建了,php8+版本都没问题,php7.4貌似不行,提示版本要大于8
7.4版本只能编译 cli 和 fpm,不能编译 micro,micro 现在不支持 < 8.0 了。
好的
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构建的时候,应该是镜像没了 或者没有权限了
请问这个可以当做PHP的源码加密来使用吗? 反向解密容易吗
https://static-php-cli.zhamao.me/zh/faq/#%E4%BD%BF%E7%94%A8-micro-%E5%8F%AF%E4%BB%A5%E4%BF%9D%E6%8A%A4%E6%88%91%E7%9A%84%E6%BA%90%E7%A0%81%E5%90%97
可以在编译前 把源码混淆,但是目前还不支持第三库扩展形式的加密,比如:swoole sg13 sg14 等等,只能goto混淆而且兼容相当差。正常能跑的混淆代码。在php-cli 中好多都不能跑,这是目前唯一的硬伤。等什么时候支持第三方扩展加密源码就好了。
有静态的 php 单文件吗。想要下载使用。
https://www.workerman.net/q/10099
看过了,不支持mac的。只能linux下。我只是想开发的时候,vscode可以格式化。又不想下载整个php
macOS下开发可以用Laravel Herd,它也是用了static-php-cli作为php运行环境的。你可以在https://dl.zhamao.xin/static-php-cli/下载mac版本的,也可以直接用Herd,还带Nginx等。
下载的可以执行命令。
用 swoole-cli ,支持 macos https://www.swoole.com/download
nihao 可以编译php7.3 f p m吗
发个评论这么难,总是敏感,也不知道什么敏感
我编译了几天都搞不定啊,网路 环境又不好,特意申请了外 编译,也是不成功,好不容易把文件下载本地,编译也不成功
他那个我都是搞了好多次都没编译成功 docker 都不好使 毛病太多了
目前急需一个7.3的fpm,docker安装php运行太慢,很奇怪,项目又是老项目所以急需一个绿色版的fpm,我看作者编译了8.0fpm,希望能抽空把7.x的编译一下,不用经常编译,有一个能用的版本就行了
似乎这玩意只支持8.0 +
看文档说明支持7.3哦
编译7.3的话得看你加了什么扩展。我这边只加五六个常用扩展是可以编译7.3的fpm的。
如果本地环境有问题最好提Issue,也许是系统原因。因为我只在页面上提到的发行版和系统测试过,不确定其他系统环境能否正常编译。文档提到的老版本不完美支持,就是很多外部扩展(比如mongodb、protobuf、swoole等)不支持老版本的PHP。PHP本身内置的扩展和一些常见的扩展都是可以编译的。
我尝试只加入mysqli可以编译成功,尝试加一个点常用扩展就不成功
你编译了哪些扩展?
楼上有没有加了pgsql扩展编译成功的>=php8.1版本的php静态文件发一个给我,或者发到群里面
我已经编译失败5次了,受不了了
大佬,拉取你最新的代码 然后再github actions构建8.1 版本 常用扩展 报错了PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: /usr/lib/php83/modules/curl (Error loading shared library /usr/lib/php83/modules/curl: No such file or directory), /usr/lib/php83/modules/curl.so (Error relocating /usr/lib/libcurl.so.4: SSL_get0_group_name: symbol not found)) in Unknown on line 0 Error relocating /usr/lib/libcurl.so.4: SSL_get0_group_name: symbol not found
[00:54:31] [ERRO] failed http fetch
Error: Process completed with exit code 1.
windwos GH action 能构建 curl扩展的 版本,但是无法运行,提示 无法找到nghttp2.dll
提个 Issue。
请问构建中
--with-suggested-exts: 编译时将 ext-suggests 也作为编译依赖加入
--with-suggested-libs: 编译时将 lib-suggests 也作为编译依赖加入
是什么意思呢?非php专属的动态库或者静态库可以用吗?有没有例子?
这个一般是指的可选功能。例如gd库如果要支持avif格式,需要libavif,使用--with-suggested-libs时,就会编译libavif,并启用啊viftexing。再比如redis有可选的igbinary协议支持,默认不编译,只有加入igbinary扩展时才会启用,使用--with-suggested-libs可以在输入
redis
扩展时,自动加入igbinary扩展。好的,谢谢
static-php.dev 大佬你的网站关了吗?
网站是部署在 GitHub Pages 上的,不会关,除非 CloudFlare 或者 GitHub 自身炸了或者我穷到银行卡没钱自动续费域名了😂
哈哈,那估计github又炸了
一顿操作猛如虎~ 压根反映不归来~