mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-18 04:44:53 +08:00
2 lines
6.0 KiB
JavaScript
2 lines
6.0 KiB
JavaScript
import{_ as l,c as e,o as s,af as a}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"构建 glibc 兼容的 Linux 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-with-glibc.md","filePath":"zh/guide/build-with-glibc.md"}'),c={name:"zh/guide/build-with-glibc.md"};function n(t,i,p,b,h,d){return s(),e("div",null,i[0]||(i[0]=[a('<h1 id="构建-glibc-兼容的-linux-二进制" tabindex="-1">构建 glibc 兼容的 Linux 二进制 <a class="header-anchor" href="#构建-glibc-兼容的-linux-二进制" aria-label="Permalink to “构建 glibc 兼容的 Linux 二进制”"></a></h1><h2 id="为什么要构建-glibc-兼容的二进制" tabindex="-1">为什么要构建 glibc 兼容的二进制 <a class="header-anchor" href="#为什么要构建-glibc-兼容的二进制" aria-label="Permalink to “为什么要构建 glibc 兼容的二进制”"></a></h2><p>目前,static-php-cli 在默认条件下在 Linux 系统构建的二进制都是基于 musl-libc(静态链接)的。 musl-libc 是一个轻量级的 libc 实现,它的目标是与 glibc 兼容,并且提供良好的纯静态链接支持。 这意味着,编译出来的静态 PHP 可执行文件在几乎任何 Linux 发行版都可以使用,而不需要考虑 libc、libstdc++ 等库的版本问题。</p><p>但是,Linux 系统的纯静态链接 musl-libc 二进制文件存在以下问题:</p><ul><li>无法使用 PHP 的 <code>dl()</code> 函数加载动态链接库和外部 PHP 扩展。</li><li>无法使用 PHP 的 FFI 扩展。</li><li>部分极端情况下,可能会出现性能问题,参见 <a href="https://github.com/php/php-src/issues/13648" target="_blank" rel="noreferrer">musl-libc 的性能问题</a>。</li></ul><p>对于不同的 Linux 发行版,它们使用的默认 libc 可能不同,比如 Alpine Linux 使用 musl libc,而大多数 Linux 发行版使用 glibc。 但即便如此,我们也不能直接使用任意的发行版和 glibc 构建便携的静态二进制文件,因为 glibc 有一些问题:</p><ul><li>基于新版本的发行版在使用 gcc 等工具构建的二进制,无法在旧版本的发行版上运行。</li><li>glibc 不推荐被静态链接,因为它的一些特性需要动态链接库的支持。</li></ul><p>但是,我们可以使用 Docker 容器来解决这个问题,最终输出的结果是一个动态链接 glibc 和一些必要库的二进制,但它静态链接所有其他依赖。</p><ol><li>使用一个旧版本的 Linux 发行版(如 CentOS 7.x),它的 glibc 版本比较旧,但是可以在大多数现代 Linux 发行版上运行。</li><li>在这个容器中构建 PHP 的静态二进制文件,这样就可以在大多数现代 Linux 发行版上运行了。</li></ol><blockquote><p>使用 glibc 的静态二进制文件,可以在大多数现代 Linux 发行版上运行,但是不能在 musl libc 的发行版上运行,如 CentOS 6、Alpine Linux 等。</p></blockquote><h2 id="构建-glibc-兼容的-linux-二进制-1" tabindex="-1">构建 glibc 兼容的 Linux 二进制 <a class="header-anchor" href="#构建-glibc-兼容的-linux-二进制-1" aria-label="Permalink to “构建 glibc 兼容的 Linux 二进制”"></a></h2><p>最新版的 static-php-cli 内置了 <code>bin/spc-gnu-docker</code> 脚本,可以一键创建一个 CentOS 7.x (glibc-2.17) 的 Docker 容器,并在容器中构建 glibc 兼容的 PHP 静态二进制文件。</p><p>然后,先运行一次以下命令。首次运行时时间较长,因为需要下载 CentOS 7.x 的镜像和一些编译工具。</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-gnu-docker</span></span></code></pre></div><p>构建镜像完成后,你将看到和 <code>bin/spc</code> 一样的命令帮助菜单,这时说明容器已经准备好了。</p><p>在容器准备好后,你可以参考 <a href="./manual-build.html">本地构建</a> 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 <code>bin/spc</code> 或 <code>./spc</code> 替换为 <code>bin/spc-gnu-docker</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-gnu-docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --build-cli</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --debug</span></span></code></pre></div><h2 id="注意事项" tabindex="-1">注意事项 <a class="header-anchor" href="#注意事项" aria-label="Permalink to “注意事项”"></a></h2><p>极少数情况下,基于 glibc 的静态 PHP 可能会出现 segment fault 等错误,但目前例子较少,如果遇到问题请提交 issue。</p><p>glibc 构建为扩展的特性,不属于默认 static-php 的支持范围。如果有相关问题或需求,请在提交 Issue 时注明你是基于 glibc 构建的。</p><p>如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 <code>bin/spc-gnu-docker</code> 脚本,手动构建一个类似的环境。</p><p>请注意,我们仅支持使用 bin/spc-gnu-docker 构建的 glibc 版本。已在 RHEL 9 和 10 上进行了编译测试并验证其稳定性,但如果您遇到问题,我们可能不会进行修复。</p>',22)]))}const g=l(c,[["render",n]]);export{o as __pageData,g as default};
|