static-php-cli/assets/zh_guide_manual-build.md.D2CB8hfN.js

192 lines
83 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"本地构建Linux、macOS、FreeBSD","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/manual-build.md","filePath":"zh/guide/manual-build.md"}'),e={name:"zh/guide/manual-build.md"};function p(t,s,h,k,d,c){return n(),a("div",null,[...s[0]||(s[0]=[l(`<h1 id="本地构建-linux、macos、freebsd" tabindex="-1">本地构建Linux、macOS、FreeBSD <a class="header-anchor" href="#本地构建-linux、macos、freebsd" aria-label="Permalink to “本地构建Linux、macOS、FreeBSD”"></a></h1><p>本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 <a href="./build-on-windows.html">在 Windows 上构建</a>。</p><h2 id="手动构建-使用-spc-二进制-推荐" tabindex="-1">手动构建(使用 SPC 二进制)(推荐) <a class="header-anchor" href="#手动构建-使用-spc-二进制-推荐" aria-label="Permalink to “手动构建(使用 SPC 二进制)(推荐)”"></a></h2><p>本项目提供了一个 static-php-cli 的二进制文件,你可以直接下载对应平台的二进制文件,然后使用它来构建静态的 PHP。目前 <code>spc</code> 二进制支持的平台有 Linux 和 macOS。</p><p>使用以下命令从自托管服务器下载:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Download from self-hosted nightly builds (sync with main branch)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># For Linux x86_64</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># For Linux aarch64</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-aarch64</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># macOS x86_64 (Intel)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># macOS aarch64 (Apple)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Windows (x86_64, win10 build 17063 or later)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl.exe</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -fsSL</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc.exe</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Add execute perm (Linux and macOS only)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">chmod</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> +x</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./spc</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Run (Linux and macOS)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">./spc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Run (Windows powershell)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">spc.exe</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span></span></code></pre></div><blockquote><p>如果你使用的是打包好的 <code>spc</code> 二进制,你需要将下面所有命令中 <code>bin/spc</code> 开头替换为 <code>./spc</code>。</p></blockquote><h2 id="手动构建-使用源码" tabindex="-1">手动构建(使用源码) <a class="header-anchor" href="#手动构建-使用源码" aria-label="Permalink to “手动构建(使用源码)”"></a></h2><p>如果使用 spc 二进制出现问题,或你有修改 static-php-cli 源码需求,请从源码下载 static-php-cli。</p><p>目前支持在 macOS、Linux 上构建macOS 支持最新版操作系统和两种架构Linux 支持 Debian、RHEL 及衍生发行版、Alpine Linux 等。</p><p>因为本项目本身采用 PHP 开发,所以在编译时也需要系统安装 PHP。本项目本身也提供了适用于本项目的静态二进制 php可以根据实际情况自行选择使用。</p><h3 id="下载本项目" tabindex="-1">下载本项目 <a class="header-anchor" href="#下载本项目" aria-label="Permalink to “下载本项目”"></a></h3><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://github.com/crazywhalecc/static-php-cli.git</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --depth=1</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> static-php-cli</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 你需要先安装 PHP 环境后再运行 Composer 和本项目,安装方式可参考下面。</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">composer</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> update</span></span></code></pre></div><h3 id="使用预编译静态-php-二进制运行-static-php-cli" tabindex="-1">使用预编译静态 PHP 二进制运行 static-php-cli <a class="header-anchor" href="#使用预编译静态-php-二进制运行-static-php-cli" aria-label="Permalink to “使用预编译静态 PHP 二进制运行 static-php-cli”"></a></h3><p>如果你不想使用 Docker、在系统内安装 PHP可以直接下载本项目自身编译好的 php 二进制 cli 程序。使用流程如下:</p><p>使用命令部署环境,此脚本会从 <a href="https://dl.static-php.dev/static-php-cli/" target="_blank" rel="noreferrer">自托管的服务器</a> 下载一个当前操作系统的 php-cli 包, 并从 <a href="https://getcomposer.org/download/latest-stable/composer.phar" target="_blank" rel="noreferrer">getcomposer</a> 或 <a href="https://mirrors.aliyun.com/composer/composer.phar" target="_blank" rel="noreferrer">Aliyun镜像</a> 下载 Composer。</p><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>使用预编译静态 PHP 二进制目前仅支持 Linux 和 macOS。FreeBSD 环境因为缺少自动化构建环境,所以暂不支持。</p></div><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/setup-runtime</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 对于中国大陆地区等网络环境特殊的用户,可使用镜像站加快下载速度</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/setup-runtime</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --mirror</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> china</span></span></code></pre></div><p>此脚本总共会下载两个文件:<code>bin/php</code> 和 <code>bin/composer</code>,下载完成后,有两种使用方式:</p><ol><li>将 <code>bin/</code> 目录添加到 PATH 路径中:<code>export PATH=&quot;/path/to/your/static-php-cli/bin:$PATH&quot;</code>,添加路径后,相当于系统安装了 PHP可直接使用 <code>composer</code>、<code>php -v</code> 等命令,也可以直接使用 <code>bin/spc</code>。</li><li>直接调用,比如执行 static-php-cli 命令:<code>bin/php bin/spc --help</code>,执行 Composer<code>bin/php bin/composer update</code>。</li></ol><h3 id="使用-docker-环境" tabindex="-1">使用 Docker 环境 <a class="header-anchor" href="#使用-docker-环境" aria-label="Permalink to “使用 Docker 环境”"></a></h3><p>如果你不愿意在系统安装 PHP 和 Composer 运行环境,可以使用内置的 Docker 环境构建脚本。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 直接使用,将所有使用的命令中 \`bin/spc\` 替换为 \`bin/spc-alpine-docker\` 即可</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc-alpine-docker</span></span></code></pre></div><p>首次执行命令会使用 <code>docker build</code> 构建一个 Docker 镜像,默认构建的 Docker 镜像为 <code>x86_64</code> 架构,镜像名称为 <code>cwcc-spc-x86_64</code>。</p><p>如果你想在 <code>x86_64</code> 环境下构建 <code>aarch64</code> 的 static-php-cli可以使用 qemu 模拟 arm 镜像运行 Docker但速度会非常慢。使用参数<code>SPC_USE_ARCH=aarch64 bin/spc-alpine-docker</code>。</p><p>如果运行后提示需要 sudo 才能运行,执行一次以下命令可授予 static-php-cli 执行 sudo 的权限:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> SPC_USE_SUDO</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">yes</span></span></code></pre></div><h3 id="使用系统-php-环境" tabindex="-1">使用系统 PHP 环境 <a class="header-anchor" href="#使用系统-php-环境" aria-label="Permalink to “使用系统 PHP 环境”"></a></h3><p>下面是系统安装 PHP、Composer 的一些示例命令。具体安装方式建议自行搜索或询问 AI 搜索引擎获取答案,这里不多赘述。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [macOS], 需要先安装 Homebrew. See https://brew.sh/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Remember change your composer executable path. For M1/M2 Chip mac, &quot;/opt/homebrew/bin/&quot;, for Intel mac, &quot;/usr/local/bin/&quot;. Or add it to your own path.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">brew</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> php</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> wget</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://getcomposer.org/download/latest-stable/composer.phar</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -O</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/your/bin/composer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &amp;&amp; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">chmod</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> +x</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/your/bin/composer</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [Debian], you need to make sure your php version &gt;= 8.4 and composer &gt;= 2.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> php-cli</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> composer</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> php-tokenizer</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>目前 Ubuntu 部分版本的 apt 安装的 php 版本较旧,故不提供安装命令。如有需要,建议先添加 ppa 等软件源后,安装最新版的 PHP 以及 tokenizer、xml、phar 扩展。</p><p>较老版本的 Debian 默认安装的可能为旧版本(&lt;= 8.3)版本的 PHP建议先升级 Debian 或使用 Docker 或自带的静态二进制环境。</p></div><h2 id="使用-craft-构建-推荐" tabindex="-1">使用 craft 构建(推荐) <a class="header-anchor" href="#使用-craft-构建-推荐" aria-label="Permalink to “使用 craft 构建(推荐)”"></a></h2><p>使用 <code>bin/spc craft</code> 可以使用一个配置文件,一个命令实现自动检查环境、下载源代码、构建依赖库、构建 PHP 及扩展等。</p><p>你需要编写一个 <code>craft.yml</code> 文件,存放在当前工作目录下。<code>craft.yml</code> 可以由 <a href="./cli-generator.html">命令生成器</a> 生成,或者手动编写。</p><p>手动编写可参考 <a href="./../develop/craft-yml.html">craft.yml 配置</a> 中的注释来编写。我们下面假设你编译一个扩展组合,并选用 PHP 8.4,输出 <code>cli</code> 和 <code>fpm</code></p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># path/to/craft.yml</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">php-version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8.4</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">extensions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bcmath,posix,phar,zlib,openssl,curl,fileinfo,tokenizer</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">sapi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">cli</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">fpm</span></span></code></pre></div><p>然后使用 <code>bin/spc craft</code> 命令来编译:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> craft</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --debug</span></span></code></pre></div><p>如果构建成功,你会在当前目录下看到 <code>buildroot/bin</code> 目录,里面包含了编译好的 PHP 二进制文件,或相应的 SAPI。</p><ul><li>cli: Windows 下构建结果为 <code>buildroot/bin/php.exe</code>,其他平台为 <code>buildroot/bin/php</code>。</li><li>fpm: 构建结果为 <code>buildroot/bin/php-fpm</code>。</li><li>micro: 构建结果为 <code>buildroot/bin/micro.sfx</code>,如需进一步与 PHP 代码打包,请查看 <a href="./manual-build.html#命令-micro-combine-打包-micro-二进制">打包 micro 二进制</a>。</li><li>embed: 参见 <a href="./manual-build.html#embed-使用">embed 使用</a>。</li><li>frankenphp: 构建结果为 <code>buildroot/bin/frankenphp</code>。</li></ul><p>如果中途构建出错,你可以使用 <code>--debug</code> 参数查看详细的错误信息,或者使用 <code>--with-clean</code> 参数清除旧的编译结果,重新编译。</p><p>如使用以上方式仍构建失败,请提交一个 issue附上你的 <code>craft.yml</code> 文件、<code>log/</code> 目录的压缩包。</p><h2 id="分步构建命令" tabindex="-1">分步构建命令 <a class="header-anchor" href="#分步构建命令" aria-label="Permalink to “分步构建命令”"></a></h2><p>如果你有定制化需求,或分开下载、编译 PHP 和依赖库的需求,可以使用 <code>bin/spc</code> 命令分步执行。</p><h3 id="命令-download-下载依赖包" tabindex="-1">命令 download - 下载依赖包 <a class="header-anchor" href="#命令-download-下载依赖包" aria-label="Permalink to “命令 download - 下载依赖包”"></a></h3><p>使用命令 <code>bin/spc download</code> 可以下载编译需要的源代码,包括 php-src 以及依赖的各种库的源码。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 仅下载要编译的扩展及依赖库(使用扩展名,包含可选库)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=openssl,swoole,zip,pcntl,zstd</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 仅下载要编译的扩展及依赖库(使用扩展名,不包含可选库)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=openssl,swoole,zip,pcntl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --without-suggestions</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 仅下载要编译的库(包括其依赖,使用库名,包含可选库,可以和 --for-extensions 组合使用)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-libs=liblz4,libevent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=pcntl,rar,xml</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 仅下载要编译的库(包括其依赖,使用库名,不包含可选库)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-libs=liblz4,libevent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --without-suggestions</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 下载资源时,忽略部分资源的缓存,强制下载(如切换特定 PHP 版本)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=curl,pcntl,xml</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --ignore-cache-sources=php-src</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --with-php=8.3.10</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 下载资源时,优先下载有预编译包的依赖库(减少编译依赖的时间)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;curl,pcntl,xml,mbstring&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prefer-pre-built</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 下载所有依赖包</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 下载所有依赖包,并指定下载的 PHP 主版本可选8.18.28.38.4,也可以使用特定的版本,如 8.3.10。</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --with-php=8.3</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 下载时显示下载进度条curl</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --debug</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 删除旧的下载数据</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --clean</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 仅下载指定的资源(使用资源名)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> php-src,micro,zstd,ext-zstd</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 设置重试次数</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --retry=2</span></span></code></pre></div><p>如果你所在地区的网络不好,或者下载依赖包速度过于缓慢,可以从 GitHub Action 下载每周定时打包的 <code>download.zip</code>,并使用命令直接使用 zip 压缩包作为依赖。 依赖包可以从 <a href="https://github.com/static-php/static-php-cli-hosted/actions/workflows/download-cache.yml" target="_blank" rel="noreferrer">Action</a> 下载到本地。 进入 Action 并选择一个最新成功运行的 Workflow下载 <code>download-files-x.y</code> 即可。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --from-zip=/path/to/your/download.zip</span></span></code></pre></div><p>如果某个 source 始终无法下载,或者你需要下载一些特定版本的包,例如下载测试版 PHP、旧版本库等可以使用参数 <code>-U</code> 或 <code>--custom-url</code> 重写下载链接, 让下载器强制使用你指定的链接下载此 source 的包。使用方法为 <code>{source-name}:{url}</code> 即可,可同时重写多个库的下载地址。在使用 <code>--for-extensions</code> 选项下载时同样可用。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 例如:指定下载 Alpha 版的 PHP8.5</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -U</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;php-src:https://downloads.php.net/~edorian/php-8.5.0alpha2.tar.xz&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 指定下载旧版本的 curl 库</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -U</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;curl:https://curl.se/download/curl-7.88.1.tar.gz&quot;</span></span></code></pre></div><p>如果你下载的资源不是链接,而是一个 Git 仓库,你可以使用 <code>-G</code> 或 <code>--custom-git</code> 重写下载链接,让下载器强制使用你指定的 Git 仓库下载此 source 的包。 使用方法为 <code>{source-name}:{branch}:{url}</code> 即可,可同时重写多个库的下载地址。在使用 <code>--for-extensions</code> 选项下载时同样可用。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 例如:下载 master 分支的 php-src</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=redis,phar</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -G</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;php-src:master:https://github.com/php/php-src.git&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 从 swoole-src 仓库下载 master 分支的最新代码,而不是发行版</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> download</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --for-extensions=swoole</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -G</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;swoole:master:https://github.com/swoole/swoole-src.git&quot;</span></span></code></pre></div><h3 id="命令-doctor-环境检查" tabindex="-1">命令 doctor - 环境检查 <a class="header-anchor" href="#命令-doctor-环境检查" aria-label="Permalink to “命令 doctor - 环境检查”"></a></h3><p>如果你可以正常运行 <code>bin/spc</code> 但无法正常编译静态的 PHP 或依赖库,可以先运行 <code>bin/spc doctor</code> 检查系统自身是否缺少依赖。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 快速检查</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> doctor</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 快速检查,并在可以自动修复的时候修复(使用包管理安装依赖包,仅支持上述提到的操作系统及发行版)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> doctor</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --auto-fix</span></span></code></pre></div><h3 id="命令-build-编译-php" tabindex="-1">命令 build - 编译 PHP <a class="header-anchor" href="#命令-build-编译-php" aria-label="Permalink to “命令 build - 编译 PHP”"></a></h3><p>使用 build 命令可以开始构建静态 php 二进制,在执行 <code>bin/spc build</code> 命令前,务必先使用 <code>download</code> 命令下载资源,建议使用 <code>doctor</code> 检查环境。</p><h4 id="基本用法" tabindex="-1">基本用法 <a class="header-anchor" href="#基本用法" aria-label="Permalink to “基本用法”"></a></h4><p>你需要先到 <a href="./extensions.html">扩展列表</a> 或 <a href="./cli-generator.html">命令生成器</a> 选择你要加入的扩展,然后使用命令 <code>bin/spc build</code> 进行编译。你需要指定一个编译目标,从如下参数中选择:</p><ul><li><code>--build-cli</code>: 构建一个 cli sapi命令行界面可在命令行执行 PHP 代码)</li><li><code>--build-fpm</code>: 构建一个 fpm sapiphp-fpm用于和其他传统的 fpm 架构的软件如 nginx 配合使用)</li><li><code>--build-cgi</code>: 构建一个 cgi sapicgi可用于传统的 cgi 架构的软件如 apache 配合使用)</li><li><code>--build-micro</code>: 构建一个 micro sapi用于构建一个包含 PHP 代码的独立可执行二进制)</li><li><code>--build-embed</code>: 构建一个 embed sapi用于嵌入到其他 C 语言程序中)</li><li><code>--build-frankenphp</code>: 构建一个 <a href="https://github.com/php/frankenphp" target="_blank" rel="noreferrer">frankenphp</a> 二进制</li><li><code>--build-all</code>: 构建以上所有 sapi</li></ul><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 编译 PHP附带 bcmath,curl,openssl,ftp,posix,pcntl 扩展,编译目标为 cli</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,curl,openssl,ftp,posix,pcntl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-cli</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 编译 PHP附带 phar,curl,posix,pcntl,tokenizer 扩展,编译目标为 micro</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> phar,curl,posix,pcntl,tokenizer</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-micro</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>如果你需要重复构建、调试,你可以删除 <code>buildroot/</code> 和 <code>source/</code> 两个目录,这样你可以从已下载的源码压缩包重新解压并构建:</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># remove</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -rf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> buildroot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> source</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># build again</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,curl,openssl,ftp,posix,pcntl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-cli</span></span></code></pre></div></div><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>如果你想构建多个版本的 PHP且不想每次都重复构建其他依赖库可以使用 <code>switch-php-version</code> 在编译好一个版本后快速切换至另一个版本并编译:</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># switch to 8.4</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> switch-php-version</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 8.4</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># build</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,curl,openssl,ftp,posix,pcntl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-cli</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># switch to 8.1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> switch-php-version</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 8.1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># build</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,curl,openssl,ftp,posix,pcntl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-cli</span></span></code></pre></div></div><h4 id="编译运行选项" tabindex="-1">编译运行选项 <a class="header-anchor" href="#编译运行选项" aria-label="Permalink to “编译运行选项”"></a></h4><p>在编译过程中,有些特殊情况需要对编译器、编译目录的内容进行干预,可以尝试使用以下命令:</p><ul><li><code>--cc=XXX</code>: 指定 C 语言编译器的执行命令Linux 默认 <code>musl-gcc</code> 或 <code>gcc</code>macOS 默认 <code>clang</code></li><li><code>--cxx=XXX</code>: 指定 C++ 语言编译器的执行命令Linux 默认 <code>g++</code>macOS 默认 <code>clang++</code></li><li><code>--with-clean</code>: 编译 PHP 前先清理旧的 make 产生的文件</li><li><code>--enable-zts</code>: 让编译的 PHP 为线程安全版本(默认为 NTS 版本)</li><li><code>--no-strip</code>: 编译 PHP 库后不运行 <code>strip</code> 裁剪二进制文件缩小体积</li><li><code>--with-libs=XXX,YYY</code>: 编译 PHP 前先编译指定的依赖库,激活部分扩展的可选功能(例如 gd 库的 libavif 等)</li><li><code>--with-config-file-path=XXX</code> 查找 <code>php.ini</code> 的路径(在 <a href="./../faq/index.html#php-ini-的路径是什么">这里</a> 查看默认路径)</li><li><code>--with-config-file-scan-dir=XXX</code> 读取 <code>php.ini</code> 后扫描 <code>.ini</code> 文件的目录(在 <a href="./../faq/index.html#php-ini-的路径是什么">这里</a> 查看默认路径)</li><li><code>-I xxx=yyy</code>: 编译前将 INI 选项硬编译到 PHP 内(支持多个选项,别名是 <code>--with-hardcoded-ini</code></li><li><code>--with-micro-fake-cli</code>: 在编译 micro 时,让 micro 的 SAPI 伪装为 <code>cli</code>(用于兼容一些检查 <code>PHP_SAPI</code> 的程序)</li><li><code>--disable-opcache-jit</code>: 禁用 opcache jit默认启用</li><li><code>-P xxx.php</code>: 在 static-php-cli 编译过程中注入外部脚本(详见下方 <strong>注入外部脚本</strong></li><li><code>--without-micro-ext-test</code>: 在构建 micro.sfx 后,禁用测试不同扩展在 micro.sfx 的运行结果</li><li><code>--with-suggested-exts</code>: 编译时将 <code>ext-suggests</code> 也作为编译依赖加入</li><li><code>--with-suggested-libs</code>: 编译时将 <code>lib-suggests</code> 也作为编译依赖加入</li><li><code>--with-upx-pack</code>: 编译后使用 UPX 减小二进制文件体积(需先使用 <code>bin/spc install-pkg upx</code> 安装 upx</li><li><code>--build-shared=XXX,YYY</code>: 编译时将指定的扩展编译为共享库(默认编译为静态库)</li></ul><p>硬编码 INI 选项适用于 cli、micro、embed。有关硬编码 INI 选项,下面是一个简单的例子,我们预设一个更大的 <code>memory_limit</code>,并且禁用 <code>system</code> 函数:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,pcntl,posix</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -I</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;memory_limit=4G&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -I</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;disable_functions=system&quot;</span></span></code></pre></div><h2 id="命令-micro-combine-打包-micro-二进制" tabindex="-1">命令 micro:combine - 打包 micro 二进制 <a class="header-anchor" href="#命令-micro-combine-打包-micro-二进制" aria-label="Permalink to “命令 micro:combine - 打包 micro 二进制”"></a></h2><p>使用 <code>micro:combine</code> 命令可以将上面编译好的 <code>micro.sfx</code> 和你的代码(<code>.php</code> 或 <code>.phar</code> 文件)构建为一个可执行二进制。 你也可以使用该命令直接构建一个注入了 ini 配置的 micro 自执行二进制文件。</p><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>注入 ini 配置指的是,在将 micro.sfx 和 PHP 源码结合前,在 micro.sfx 后追加一段特殊的结构用于保存 ini 配置项。</p><p>micro.sfx 可通过特殊的字节来标识 INI 文件头,通过 INI 文件头可以实现 micro 带 INI 启动。</p><p>此特性的原说明地址在 <a href="https://github.com/easysoft/phpmicro/wiki/INI-settings" target="_blank" rel="noreferrer">phpmicro - Wiki</a>,这个特性也有可能在未来发生变化。</p></div><p>下面是常规用法,直接打包 php 源码到一个文件中:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 在做打包流程前,你应该先使用 \`build --build-micro\` 编译好 micro.sfx</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;&lt;?php echo &#39;hello&#39;;&quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> micro:combine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 使用</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">./my-app</span></span></code></pre></div><p>你可以使用以下参数指定要输出的文件名,你也可以指定其他路径的 micro.sfx 进行打包。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 指定输出文件名</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> micro:combine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --output=custom-bin</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 使用绝对路径,也可以使用简化参数名</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> micro:combine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -O</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /tmp/my-custom-app</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 指定其他位置的 micro.sfx 进行打包</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> micro:combine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.app</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --with-micro=/path/to/your/micro.sfx</span></span></code></pre></div><p>如果想注入 ini 配置项,可以使用下面的参数,从文件或命令行选项添加 ini 到可执行文件中。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 使用命令行选项指定(-I 是 --with-ini-set 的简写)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> micro:combine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -I</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;a=b&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -I</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;foo=bar&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 使用 ini 文件指定(-N 是 --with-ini-file 的简写)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> micro:combine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -N</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/your/custom.ini</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title custom-block-title-default">WARNING</p><p>注意,请不要直接使用 PHP 源码或系统安装的 PHP 中的 <code>php.ini</code> 文件,最好手动编写一个自己需要的参数配置文件,例如:</p><div class="language-ini"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">; custom.ini</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">curl.cainfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">=/path/to/your/cafile.pem</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">memory_limit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">=1G</span></span></code></pre></div><p>该命令的注入 ini 是通过在 micro.sfx 后追加一段特殊的结构来实现的,和编译时插入硬编码 INI 的功能不同。</p></div><p>如果要打包 phar只需要将 <code>a.php</code> 替换为打包好的 phar 文件即可。但要注意phar 下的 micro.sfx 需要额外注意路径问题,见 <a href="./../develop/structure.html#phar-应用目录问题">Developing - Phar 路径问题</a></p><h2 id="调试" tabindex="-1">调试 <a class="header-anchor" href="#调试" aria-label="Permalink to “调试”"></a></h2><p>如果你在编译过程中遇到了问题,或者想查看每个执行的 shell 命令,可以使用 <code>--debug</code> 开启 debug 模式,查看所有终端日志:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> mysqlnd,pdo_mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --debug</span></span></code></pre></div><h2 id="命令-extract-手动解压某个库" tabindex="-1">命令 extract - 手动解压某个库 <a class="header-anchor" href="#命令-extract-手动解压某个库" aria-label="Permalink to “命令 extract - 手动解压某个库”"></a></h2><p>使用命令 <code>bin/spc extract</code> 可以解包和拷贝编译需要的源代码,包括 php-src 以及依赖的各种库的源码(需要自己指定要解包的库名)。</p><p>例如,我们在下载好资源后,想分布执行构建流程,手动解包和拷贝包到指定位置,可以使用命令。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 解压 php-src 和 libxml2 的下载压缩包,解压的源码存放在 source 目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> extract</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> php-src,libxml2</span></span></code></pre></div><h2 id="命令-dump-extensions-导出项目扩展依赖" tabindex="-1">命令 dump-extensions - 导出项目扩展依赖 <a class="header-anchor" href="#命令-dump-extensions-导出项目扩展依赖" aria-label="Permalink to “命令 dump-extensions - 导出项目扩展依赖”"></a></h2><p>使用命令 <code>bin/spc dump-extensions</code> 可以导出当前项目的扩展依赖。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 打印项目的扩展列表传入项目包含composer.json的根目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dump-extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/your/project/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 打印项目的扩展列表,不包含开发依赖</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dump-extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path-to/tour/project/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-dev</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出为 spc 命令可接受的扩展列表格式(逗号分割)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dump-extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path-to/tour/project/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --format=text</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出为 JSON 列表</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dump-extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path-to/tour/project/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --format=json</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 当项目没有任何扩展时,输出指定扩展组合,而不是返回失败</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dump-extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path-to/your/project/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-ext-output=mbstring,posix,pcntl,phar</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出时不排除 spc 不支持的扩展</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dump-extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/your/project/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-spc-filter</span></span></code></pre></div><p>需要注意的是,项目的目录下必须包含 <code>vendor/installed.json</code> 和 <code>composer.lock</code> 文件,否则无法正常获取。</p><h2 id="调试命令-dev-调试命令集合" tabindex="-1">调试命令 dev - 调试命令集合 <a class="header-anchor" href="#调试命令-dev-调试命令集合" aria-label="Permalink to “调试命令 dev - 调试命令集合”"></a></h2><p>调试命令指的是你在使用 static-php-cli 构建 PHP 或改造、增强 static-php-cli 项目本身的时候,可以辅助输出一些信息的命令集合。</p><ul><li><code>dev:extensions</code>: 输出目前所有支持的扩展信息,或者输出指定的扩展信息</li><li><code>dev:php-version</code>: 输出当前编译的 PHP 版本(通过读取 <code>php_version.h</code> 实现)</li><li><code>dev:sort-config</code>: 对 <code>config/</code> 目录下的配置文件的列表按照字母表排序</li><li><code>dev:lib-ver &lt;lib-name&gt;</code>: 从依赖库的源码中读取版本(仅特定依赖库可用)</li><li><code>dev:ext-ver &lt;ext-name&gt;</code>: 从扩展的源码中读取对应版本(仅特定扩展可用)</li><li><code>dev:pack-lib &lt;lib-name&gt;</code>: 打包指定的依赖库(仅发布者可用)</li><li><code>dev:gen-ext-docs</code>: 生成扩展文档(仅发布者可用)</li></ul><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出所有扩展</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:extensions</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出指定扩展的信息</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:extensions</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> mongodb,curl,openssl</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出指定列可选lib-depends, lib-suggests, ext-depends, ext-suggests, unix-only, type</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:extensions</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --columns=lib-depends,type,ext-depends</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出当前编译的 PHP 版本(需要先将下载好的 PHP 源码解压到 source 目录,你可以使用 \`bin/spc extract php-src\` 单独解压缩源码)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:php-version</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 排序配置文件 ext.json也可以排序 lib、source</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:sort-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ext</span></span></code></pre></div><h2 id="命令-install-pkg-下载二进制包" tabindex="-1">命令 install-pkg - 下载二进制包 <a class="header-anchor" href="#命令-install-pkg-下载二进制包" aria-label="Permalink to “命令 install-pkg - 下载二进制包”"></a></h2><p>使用命令 <code>bin/spc install-pkg</code> 可以下载一些预编译或闭源的工具,并将其安装到 <code>pkgroot</code> 目录中。</p><p>在 <code>bin/spc doctor</code> 自动修复 Windows 环境时会下载 nasm、perl 等工具,使用的也是 <code>install-pkg</code> 的安装过程。</p><p>下面是安装工具的示例:</p><ul><li>下载安装 UPX仅限 Linux 和 Windows: <code>bin/spc install-pkg upx</code></li><li>下载安装 nasm仅限 Windows: <code>bin/spc install-pkg nasm</code></li><li>下载安装 go-xcaddy: <code>bin/spc install-pkg go-xcaddy</code></li></ul><h2 id="命令-del-download-删除已下载的资源" tabindex="-1">命令 del-download - 删除已下载的资源 <a class="header-anchor" href="#命令-del-download-删除已下载的资源" aria-label="Permalink to “命令 del-download - 删除已下载的资源”"></a></h2><p>一些情况下,你需要删除单个或多个指定的下载源文件,并重新下载他们,例如切换 PHP 版本,<code>2.1.0-beta.4</code> 版本后提供了 <code>bin/spc del-download</code> 命令,可以删除指定源文件。</p><p>删除已下载的源文件包含预编译的包以及源代码,名称是 <code>source.json</code> 或 <code>pkg.json</code> 中的键名。下面是一些例子:</p><ul><li>删除 PHP 8.2 源码并切换下载为 8.3 版本: <code>bin/spc del-download php-src &amp;&amp; bin/spc download php-src --with-php=8.3</code></li><li>删除 redis 扩展的下载文件: <code>bin/spc del-download redis</code></li><li>删除下载好的 musl-toolchain x86_64: <code>bin/spc del-download musl-toolchain-x86_64-linux</code></li></ul><h2 id="注入外部脚本" tabindex="-1">注入外部脚本 <a class="header-anchor" href="#注入外部脚本" aria-label="Permalink to “注入外部脚本”"></a></h2><p>注入外部脚本指的是在 static-php-cli 编译过程中插入一个或多个脚本,用于更灵活地支持不同环境下的参数修改、源代码补丁。</p><p>一般情况下,该功能主要解决使用 <code>spc</code> 二进制进行编译时无法通过修改 static-php-cli 代码来实现修改补丁的功能。 还有一种情况:你的项目直接依赖了 <code>crazywhalecc/static-php-cli</code> 仓库并同步,但因为项目特性需要做出一些专有的修改,而这些特性并不适合合并到主分支。</p><p>鉴于以上情况,在 2.0.1 正式版本中static-php-cli 加入了多个事件的触发点,你可以通过编写外部的 <code>xx.php</code> 脚本,并通过命令行参数 <code>-P</code> 传入并执行。</p><p>在编写注入外部脚本时,你一定会用到的方法是 <code>builder()</code> 和 <code>patch_point()</code>。其中,<code>patch_point()</code> 获取的是当前正在执行的事件名称,<code>builder()</code> 获取的是 BuilderBase 对象。</p><p>因为传入的注入点不区分事件,所以你必须将你要执行的代码写在 <code>if(patch_point() === &#39;your_event_name&#39;)</code> 中,否则会重复在其他事件中执行。</p><p>下面是支持的 patch_point 事件名称及对应位置:</p><table tabindex="0"><thead><tr><th>事件名称</th><th>事件描述</th></tr></thead><tbody><tr><td>before-libs-extract</td><td>在编译的依赖库解压前触发</td></tr><tr><td>after-libs-extract</td><td>在编译的依赖库解压后触发</td></tr><tr><td>before-php-extract</td><td>在 PHP 源码解压前触发</td></tr><tr><td>after-php-extract</td><td>在 PHP 源码解压后触发</td></tr><tr><td>before-micro-extract</td><td>在 phpmicro 解压前触发</td></tr><tr><td>after-micro-extract</td><td>在 phpmicro 解压后触发</td></tr><tr><td>before-exts-extract</td><td>在要编译的扩展解压到 PHP 源码目录前触发</td></tr><tr><td>after-exts-extract</td><td>在要编译的扩展解压到 PHP 源码目录后触发</td></tr><tr><td>before-library[<em>name</em>]-build</td><td>在名称为 <code>name</code> 的库编译前触发(如 <code>before-library[postgresql]-build</code></td></tr><tr><td>after-library[<em>name</em>]-build</td><td>在名称为 <code>name</code> 的库编译后触发</td></tr><tr><td>after-shared-ext[<em>name</em>]-build</td><td>在名称为 <code>name</code> 的共享扩展编译后触发(如 <code>after-shared-ext[redis]-build</code></td></tr><tr><td>before-shared-ext[<em>name</em>]-build</td><td>在名称为 <code>name</code> 的共享扩展编译前触发</td></tr><tr><td>before-php-buildconf</td><td>在编译 PHP 命令 <code>./buildconf</code> 前触发</td></tr><tr><td>before-php-configure</td><td>在编译 PHP 命令 <code>./configure</code> 前触发</td></tr><tr><td>before-php-make</td><td>在编译 PHP 命令 <code>make</code> 前触发</td></tr><tr><td>before-sanity-check</td><td>在编译 PHP 后,运行扩展检查前触发</td></tr></tbody></table><p>下面是一个简单的临时修改 PHP 源码的例子,开启 CLI 下在当前工作目录查找 <code>php.ini</code> 配置的功能:</p><div class="language-php"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// a.php</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;?</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">php</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">patch_point</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;before-php-buildconf&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // replace php source code</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\SPC\\store\\FileSystem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replaceFileStr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> SOURCE_PATH</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> .</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;/php-src/sapi/cli/php_cli.c&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;sapi_module-&gt;php_ini_ignore_cwd = 1;&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;sapi_module-&gt;php_ini_ignore_cwd = 0;&#39;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> mbstring</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-cli</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -P</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a.php</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;memory_limit=8G&#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./php.ini</span></span></code></pre></div><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span>$ buildroot/bin/php -i | grep Loaded</span></span>
<span class="line"><span>Loaded Configuration File =&gt; /Users/jerry/project/git-project/static-php-cli/php.ini</span></span>
<span class="line"><span></span></span>
<span class="line"><span>$ buildroot/bin/php -i | grep memory</span></span>
<span class="line"><span>memory_limit =&gt; 8G =&gt; 8G</span></span></code></pre></div><p>对于 static-php-cli 支持的对象、方法及接口,可以阅读源码,大部分的方法和对象都有相应的注释。</p><p>一般使用 <code>-P</code> 功能常用的对象及函数有:</p><ul><li><code>SPC\\store\\FileSystem</code>: 文件管理类 <ul><li><code>::replaceFileStr(string $filename, string $search, $replace)</code>: 替换文件字符串内容</li><li><code>::replaceFileStr(string $filename, string $pattern, $replace)</code>: 正则替换文件内容</li><li><code>::replaceFileUser(string $filename, $callback)</code>: 用户自定义函数替换文件内容</li><li><code>::copyDir(string $from, string $to)</code>: 递归拷贝某个目录到另一个位置</li><li><code>::convertPath(string $path)</code>: 转换路径的分隔符为当前系统分隔符</li><li><code>::scanDirFiles(string $dir, bool $recursive = true, bool|string $relative = false, bool $include_dir = false)</code>: 遍历目录文件</li></ul></li><li><code>SPC\\builder\\BuilderBase</code>: 构建对象 <ul><li><code>-&gt;getPatchPoint()</code>: 获取当前的注入点名称</li><li><code>-&gt;getOption(string $key, $default = null)</code>: 获取命令行和编译时的选项</li><li><code>-&gt;getPHPVersionID()</code>: 获取当前编译的 PHP 版本 ID</li><li><code>-&gt;getPHPVersion()</code>: 获取当前编译的 PHP 版本号</li><li><code>-&gt;setOption(string $key, $value)</code>: 设定选项</li><li><code>-&gt;setOptionIfNotExists(string $key, $value)</code>: 如果选项不存在则设定选项</li></ul></li></ul><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>static-php-cli 开放的方法非常多,文档中无法一一列举,但只要是 <code>public function</code> 并且不被标注为 <code>@internal</code>,均可调用。</p></div><h2 id="多次构建" tabindex="-1">多次构建 <a class="header-anchor" href="#多次构建" aria-label="Permalink to “多次构建”"></a></h2><p>如果你在本地要多次构建,以下方法可以为你节省下载资源、编译的时间。</p><ul><li>仅切换 PHP 版本,不更换依赖库版本时,可以使用 <code>bin/spc switch-php-version</code> 快速切换 PHP 版本,然后重新运行同样的 <code>build</code> 命令。</li><li>如果你想重新构建一次,但不重新下载源码,可以先 <code>rm -rf buildroot source</code> 删除编译目录和源码目录,然后重新构建。</li><li>如果你想更新某个依赖的版本,可以使用 <code>bin/spc del-download &lt;source-name&gt;</code> 删除指定的源码,然后使用 <code>download &lt;source-name&gt;</code> 重新下载。</li><li>如果你想更新所有依赖的版本,可以使用 <code>bin/spc download --clean</code> 删除所有下载的源码,然后重新下载。</li></ul><h2 id="embed-使用" tabindex="-1">embed 使用 <a class="header-anchor" href="#embed-使用" aria-label="Permalink to “embed 使用”"></a></h2><p>如果你想将 static-php 嵌入到其他 C 语言程序中,可以使用 <code>--build-embed</code> 构建一个 embed 版本的 PHP。</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> {your</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> extensions}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-embed</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --debug</span></span></code></pre></div><p>在通常的情况下PHP embed 编译后会生成 <code>php-config</code>。对于 static-php我们提供了 <code>spc-config</code>,用于获取编译时的参数。 另外,在使用 embed SAPIlibphp.a你需要使用和编译 libphp 相同的编译器,否则会出现链接错误。</p><p>下面是 spc-config 的基本用法:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># output all flags and options</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> curl,zlib,phar,openssl</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># output libs</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> curl,zlib,phar,openssl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --libs</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># output includes</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> curl,zlib,phar,openssl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --includes</span></span></code></pre></div><p>默认情况下static-php 在不同系统使用的编译器分别是:</p><ul><li>macOS: <code>clang</code></li><li>Linux (Alpine Linux): <code>gcc</code></li><li>Linux (glibc based distros, x86_64): <code>/usr/local/musl/bin/x86_64-linux-musl-gcc</code></li><li>Linux (glibc based distros, aarch64): <code>/usr/local/musl/bin/aarch64-linux-musl-gcc</code></li><li>FreeBSD: <code>clang</code></li></ul><p>下面是一个使用 embed SAPI 的例子:</p><div class="language-c"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// embed.c</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &lt;sapi/embed/php_embed.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> argc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">char</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> **</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">argv</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">){</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> PHP_EMBED_START_BLOCK</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(argc,argv)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> zend_file_handle file_handle;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> zend_stream_init_filename</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">file_handle,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;embed.php&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">php_execute_script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">file_handle) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> FAILURE){</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> php_printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Failed to execute PHP script.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> PHP_EMBED_END_BLOCK</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-php"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;?</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">php</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// embed.php</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;Hello world!</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># compile in debian/ubuntu x86_64</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">/usr/local/musl/bin/x86_64-linux-musl-gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> embed.c</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,zlib</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">-static</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> embed</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># compile in macOS/FreeBSD</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">clang</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> embed.c</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> spc-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,zlib</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">-o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> embed</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">./embed</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># out: Hello world!</span></span></code></pre></div>`,135)])])}const g=i(e,[["render",p]]);export{o as __pageData,g as default};