PHPMicromicro 自執(zhí)行 SAPI
microphp 自執(zhí)行 SAPI
micro 自執(zhí)行 SAPI 提供了 php“自執(zhí)行文件”的可能性
你只需要將構(gòu)建的 micro.sfx 文件與任意 php 文件或者 phar 包拼接(cat 或者 copy /b)為一個(gè)文件就可以直接執(zhí)行這個(gè) php 文件
兼容性
目前兼容 PHP7.4 與 8.0;兼容 Windows、Linux、macOS。
構(gòu)建
準(zhǔn)備源碼
1.將本倉(cāng)庫(kù)clone到php源碼的sapi/micro下
# 在php源碼目錄下 git clone <url for this repo> sapi/micro
2.打patch
patch文件在patches目錄下,選擇patch文件:
| patch文件 | 平臺(tái)/PHP版本 | 是否必須 | 作用 |
|---|---|---|---|
| disable_huge_page.patch | Linux | 可選 | 禁用linux構(gòu)建的max-page-size選項(xiàng),縮減sfx體積(典型的, 10M+ -> 5M) |
| vcruntime140_<php version>.patch | Windows | 必選 | 禁用sfx啟動(dòng)時(shí)GetModuleHandle(vcruntime140(d).dll) |
| win32_<php version>.patch | Windows | 必選 | 修改構(gòu)建系統(tǒng)以靜態(tài)構(gòu)建 |
| zend_stream.patch | Windows | 必選 | 修改構(gòu)建系統(tǒng)以靜態(tài)構(gòu)建 |
| phar.patch | * | 可選 | 實(shí)現(xiàn)phar的支持 |
并分別進(jìn)行patch:
# 在php源碼目錄下 patch -p1 < sapi/micro/patches/<name of patch>
unix-like 構(gòu)建
0.參考官方構(gòu)建說(shuō)明準(zhǔn)備PHP構(gòu)建環(huán)境
1.buildconf
# 在php源碼目錄下 ./buildconf --force
2.configure
# 在php源碼目錄下 ./configure <options>
參考的選項(xiàng):
--disable-phpdbg --disable-cgi --disable-cli --disable-all --enable-micro --enable-phar --with-ffi --enable-zlib
3.make
# 在php源碼目錄下 make micro
(make all(或者make) 或許也可以,但建議還是只構(gòu)建micro SAPI
生成的文件在 sapi/micro/micro.sfx
Windows 構(gòu)建
0.參考官方構(gòu)建說(shuō)明準(zhǔn)備PHP構(gòu)建環(huán)境
1.buildconf
# 在php源碼目錄下 buildconf
2.configure
# 在php源碼目錄下 configure <options>
參考的選項(xiàng):
--disable-all --disable-zts --enable-micro --enable-phar --with-ffi --enable-zlib
3.make 由于構(gòu)建系統(tǒng)的實(shí)現(xiàn)問(wèn)題, Windows下不能使用nmake命令直接構(gòu)建,使用nmake sfx來(lái)構(gòu)建
# 在php源碼目錄下 nmake sfx
生成的文件在 <架構(gòu)名>\<配置名>\micro.sfx
使用
將micro.sfx和php文件拼接即可
例如:myawesomeapp.php內(nèi)容為
<?php echo "hello, this is my awesome app." . PHP_EOL;
linux下
cat /path/to/micro.sfx myawesomeapp.php > myawesomeapp chmod 0755 ./myawesomeapp ./myawesomeapp # 回顯 "hello, this is my awesome app."
或者Windows下
COPY /b \path\to\micro.sfx + myawesomeapp.php myawesomeapp.exe myawesomeapp.exe REM 回顯 "hello, this is my awesome app."
優(yōu)化
linux下php對(duì)于hugepages優(yōu)化導(dǎo)致了生成的文件很大,如果不考慮對(duì)hugepages的優(yōu)化,使用disable_huge_page.patch來(lái)來(lái)減小文件尺寸
linux下靜態(tài)構(gòu)建需要包含c標(biāo)準(zhǔn)庫(kù),常見(jiàn)的glibc較大,推薦使用musl,手動(dòng)安裝的musl或者某些發(fā)行版會(huì)提供gcc(或clang)的musl wrapper:musl-gcc或者musl-clang。在進(jìn)行configure之前,通過(guò)指定CC和CXX變量來(lái)使用這些wrapper
例如
# ./buildconf things... export CC=musl-gcc export CXX=musl-gcc # ./configure balabala # make balabala
linux下構(gòu)建時(shí)一般希望是純靜態(tài)的,但構(gòu)建使用的發(fā)行版不一定提供依賴(lài)的庫(kù)(zlib libffi等)的靜態(tài)庫(kù)版本,這時(shí)考慮自行構(gòu)建依賴(lài)庫(kù)
以libffi為例:
# 通過(guò)git獲取源碼 git clone https://github.com/libffi/libffi cd libffi git checkout <version you like, v3.3 for example> autoreconf -i # 或者直接下載tarball解壓 wget <url> tar xf <tar name> cd <extracted name> # 如果使用musl的話 export CC=musl-gcc export CXX=musl-gcc # 構(gòu)建安裝 ./configure --prefix=/my/prefered/path && make -j`nproc` && make install
然后使用以下export命令來(lái)構(gòu)建micro:
# ./buildconf things... # export CC=musl-xxx things... export PKG_CONFIG_PATH=/my/prefered/path/lib/pkgconfig # ./configure balabala # make balabala
