鑒于之前的老版本是純 Bash 寫的,擴展性不是很好,而且里面的庫、擴展無法及時使用最新版,所以一怒之下重寫了整個編譯項目。新版本支持舊版本的所有擴展,同時也新增了很多擴展。
https://github.com/crazywhalecc/static-php-cli
新版本可以手動本地在 Linux(Debian、Ubuntu、RHEL、CentOS 等主流發(fā)行版)、Windows、Alpine Linux、macOS、FreeBSD 下構(gòu)建,也可以在 GH Action 手動觸發(fā)構(gòu)建。同時支持了一些新的特性:
cli
、micro
、fpm
、embed
)。--enable-zts
)。cli
模式。pgsql
、snappy
、swow
、apcu
等,詳見 支持擴展列表。目前測試了下 Workerman 和 webman 項目都可以正常構(gòu)建和運行。
可以增加oracle和SqlServer的擴展嗎
這個很困難了,因為目前編譯的是都支持 in-tree 構(gòu)建的擴展,而擴展本身也不能依賴不開源的第三方庫(除非依賴庫提供靜態(tài)鏈接的庫 .a)。
Windows 和 macOS 環(huán)境下可以嘗試動態(tài)加載 oracle 擴展和庫。總的來說不可以靜態(tài)編譯 oracle 擴展的原因是 oracle 數(shù)據(jù)庫 oracle 官方?jīng)]有提供編譯的源碼或者供靜態(tài)編譯的 ar 文件,所以沒有辦法編譯到 PHP 內(nèi),只能采用外部擴展的方式。
大佬,什么可以減少打包后體積的方法嗎?
如果是二進制本身,那現(xiàn)在已經(jīng)做了一定程度的優(yōu)化了,包括strip、-Os等優(yōu)化。如果是后面跟著的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 構(gòu)建,建議先刪除 Action Cache,并且 sync fork 后再編譯。如果是本地編譯,git pull 更新項目后,刪除 source
,downloads
,buildroot
目錄后再次構(gòu)建。因為近期 curl 發(fā)布了 8.1.0 新版本,增加了編譯過程中對 argv 的檢查,而默認本項目對 CMake 項目使用了交叉編譯的參數(shù),導致檢查無法正常進行。最近一次也修復了這個問題,但需要清除舊的編譯數(shù)據(jù)。(source 目錄保存的是編譯源碼目錄,buildroot 保存的是編譯目標文件,downloads 保存的是依賴庫下載壓縮包)
mongodb擴展,mac本地編譯和 GitHub Action 構(gòu)建都會報錯
這個問題和mongodb官方的驅(qū)動代碼有關(guān),它沒有提供幾個可選庫的禁用編譯參數(shù)選項,而且它默認會搜索系統(tǒng)路徑無法忽略,以至于在configure階段認為有庫,在link階段找不到libxxx.a的庫從而導致報錯。已向mongodb庫提Issue,如果近期無法解決,我先會patch資源讓它禁用掉。
大佬,打包php8.1版本 cli啟動有 zend_mm_heap corrupted 錯誤,不知道是什么導致的
是 Action 編譯的還是本地編譯的?如果是本地的話,每次編譯完最好刪除 source 和 buildroot 目錄再進行新的編譯,有時候在不同擴展下多次編譯會出現(xiàn)這種情況。如果這樣還能穩(wěn)定復現(xiàn)的話,麻煩提供一下編譯的命令和編譯出來的二進制文件。
打包出來的micro.sfx與webman.phar結(jié)合成一個文件后,運行提示:Only run in command line mode;
dixyes/lwmbs 這個項目的discussions里的FAQ里咨詢過作者,micro.sfx、micro_cli.sfx的區(qū)別(后者SAPI name為cli),不知道crazywhalecc/static-php-cli的作者是否也是一致的處理方式
目前 static-php-cli 編譯的 phpmicro 沒開啟 sapi 轉(zhuǎn)換,也就是 -DPHP_MICRO_FAKE_CLI
這個編譯選項。主要是這個選項雖然省事但是入侵了原有的 SAPI,不考慮使用這種方式。如果可能的話,修改 PHP 代碼中判斷 SAPI 的邏輯是更好的一勞永逸解決方案。
我后面還是加個編譯參數(shù)吧,畢竟可選更好一點。但默認還會是 micro。另外 composer 包應該有檢測 sapi 環(huán)境的,但這個得看擴展對應的代碼了,一般 composer 擴展都是通用 fpm、cli 所以單獨判斷的不多。
你好,請問我這個是什么原因呢,嚶特爾的mac ,下載的是這個文件,https://dl.zhamao.xin/static-php-cli/php-8.0.28-cli-linux-x86_64.tar.gz ,執(zhí)行報錯
使用這個命令編譯常用擴展的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
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.
大佬,現(xiàn)在報錯了 actons構(gòu)建的時候,應該是鏡像沒了 或者沒有權(quán)限了
有靜態(tài)的 php 單文件嗎。想要下載使用。
macOS下開發(fā)可以用Laravel Herd,它也是用了static-php-cli作為php運行環(huán)境的。你可以在https://dl.zhamao.xin/static-php-cli/下載mac版本的,也可以直接用Herd,還帶Nginx等。
nihao 可以編譯php7.3 f p m嗎
目前急需一個7.3的fpm,docker安裝php運行太慢,很奇怪,項目又是老項目所以急需一個綠色版的fpm,我看作者編譯了8.0fpm,希望能抽空把7.x的編譯一下,不用經(jīng)常編譯,有一個能用的版本就行了
# 測試環(huán)境: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
如果本地環(huán)境有問題最好提Issue,也許是系統(tǒng)原因。因為我只在頁面上提到的發(fā)行版和系統(tǒng)測試過,不確定其他系統(tǒng)環(huán)境能否正常編譯。文檔提到的老版本不完美支持,就是很多外部擴展(比如mongodb、protobuf、swoole等)不支持老版本的PHP。PHP本身內(nèi)置的擴展和一些常見的擴展都是可以編譯的。
樓上有沒有加了pgsql擴展編譯成功的>=php8.1版本的php靜態(tài)文件發(fā)一個給我,或者發(fā)到群里面
我已經(jīng)編譯失敗5次了,受不了了
大佬,拉取你最新的代碼 然后再github actions構(gòu)建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.
請問構(gòu)建中
--with-suggested-exts: 編譯時將 ext-suggests 也作為編譯依賴加入
--with-suggested-libs: 編譯時將 lib-suggests 也作為編譯依賴加入
是什么意思呢?非php專屬的動態(tài)庫或者靜態(tài)庫可以用嗎?有沒有例子?
這個一般是指的可選功能。例如gd庫如果要支持avif格式,需要libavif,使用--with-suggested-libs時,就會編譯libavif,并啟用啊viftexing。再比如redis有可選的igbinary協(xié)議支持,默認不編譯,只有加入igbinary擴展時才會啟用,使用--with-suggested-libs可以在輸入redis
擴展時,自動加入igbinary擴展。
static-php.dev 大佬你的網(wǎng)站關(guān)了嗎?
網(wǎng)站是部署在 GitHub Pages 上的,不會關(guān),除非 CloudFlare 或者 GitHub 自身炸了或者我窮到銀行卡沒錢自動續(xù)費域名了??
太好了,非常感謝你的項目,非常棒