2024-07-01 02:35:17 +00:00
<!DOCTYPE html>
< html lang = "zh" dir = "ltr" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1" >
2025-10-28 10:57:01 +00:00
< title > 本地构建( Linux、macOS、FreeBSD) | Static PHP< / title >
2024-07-01 02:35:17 +00:00
< meta name = "description" content = "Build single static PHP binary, with PHP project together, with popular extensions included." >
2025-08-31 05:45:13 +00:00
< meta name = "generator" content = "VitePress v2.0.0-alpha.12" >
2025-10-28 10:57:01 +00:00
< link rel = "preload stylesheet" href = "/assets/style.Djf3bAdT.css" as = "style" >
2025-06-12 04:49:10 +00:00
< link rel = "preload stylesheet" href = "/vp-icons.css" as = "style" >
2024-07-01 02:35:17 +00:00
2025-08-31 05:45:13 +00:00
< script type = "module" src = "/assets/app.C9FYtCRt.js" > < / script >
2024-07-01 02:35:17 +00:00
< link rel = "preload" href = "/assets/inter-roman-latin.Di8DUHzh.woff2" as = "font" type = "font/woff2" crossorigin = "" >
2025-08-31 05:45:13 +00:00
< link rel = "modulepreload" href = "/assets/chunks/theme.MOrVMOSc.js" >
< link rel = "modulepreload" href = "/assets/chunks/framework.Bhsyh9kO.js" >
2025-09-05 09:53:03 +00:00
< link rel = "modulepreload" href = "/assets/zh_guide_manual-build.md.C3iksvHw.lean.js" >
2024-07-01 02:35:17 +00:00
< script id = "check-dark-mode" > ( ( ) => { const e = localStorage . getItem ( "vitepress-theme-appearance" ) || "auto" , a = window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ; ( ! e || e === "auto" ? a : e === "dark" ) && document . documentElement . classList . add ( "dark" ) } ) ( ) ; < / script >
< script id = "check-mac-os" > document . documentElement . classList . toggle ( "mac" , /Mac|iPhone|iPod|iPad/i . test ( navigator . platform ) ) ; < / script >
< / head >
< body >
2025-10-28 10:57:01 +00:00
< div id = "app" > < div class = "Layout" data-v-1df9f90f > <!-- [ --> <!-- ] --> <!-- [ --> < span tabindex = "-1" data-v-0b0ada53 > < / span > < a href = "#VPContent" class = "VPSkipLink visually-hidden" data-v-0b0ada53 > Skip to content< / a > <!-- ] --> <!-- --> < header class = "VPNav" data-v-1df9f90f data-v-9f75dce3 > < div class = "VPNavBar" data-v-9f75dce3 data-v-2a96a3d0 > < div class = "wrapper" data-v-2a96a3d0 > < div class = "container" data-v-2a96a3d0 > < div class = "title" data-v-2a96a3d0 > < div class = "VPNavBarTitle has-sidebar" data-v-2a96a3d0 data-v-1e38c6bc > < a class = "title" href = "/zh/" data-v-1e38c6bc > <!-- [ --> <!-- ] --> <!-- [ --> < img class = "VPImage logo" src = "/images/static-php_nobg.png" alt data-v-8426fc1a > <!-- ] --> < span data-v-1e38c6bc > Static PHP< / span > <!-- [ --> <!-- ] --> < / a > < / div > < / div > < div class = "content" data-v-2a96a3d0 > < div class = "content-body" data-v-2a96a3d0 > <!-- [ --> <!-- ] --> < div class = "VPNavBarSearch search" data-v-2a96a3d0 > <!-- [ --> <!-- --> < div id = "docsearch" > < button type = "button" aria-label = "Search" aria-keyshortcuts = "/ control+k meta+k" class = "DocSearch DocSearch-Button" > < span class = "DocSearch-Button-Container" > < span class = "vpi-search DocSearch-Search-Icon" > < / span > < span class = "DocSearch-Button-Placeholder" > Search< / span > < / span > < span class = "DocSearch-Button-Keys" > < kbd class = "DocSearch-Button-Key" > < / kbd > < kbd class = "DocSearch-Button-Key" > < / kbd > < / span > < / button > < / div > <!-- ] --> < / div > < nav aria-labelledby = "main-nav-aria-label" class = "VPNavBarMenu menu" data-v-2a96a3d0 data-v-39714824 > < span id = "main-nav-aria-label" class = "visually-hidden" data-v-39714824 > Main Navigation < / span > <!-- [ --> <!-- [ --> < a class = "VPLink link VPNavBarMenuLink" href = "/zh/guide/" tabindex = "0" data-v-39714824 data-v-e56f3d57 > <!-- [ --> < span data-v-e56f3d57 > 构建指南< / span > <!-- ] --> < / a > <!-- ] --> <!-- [ --> < a class = "VPLink link VPNavBarMenuLink" href = "/zh/develop/" tabindex = "0" data-v-39714824 data-v-e56f3d57 > <!-- [ --> < span data-v-e56f3d57 > 进阶< / span > <!-- ] --> < / a > <!-- ] --> <!-- [ --> < a class = "VPLink link VPNavBarMenuLink" href = "/zh/contributing/" tabindex = "0" data-v-39714824 data-v-e56f3d57 > <!-- [ --> < span data-v-e56f3d57 > 贡献< / span > <!-- ] --> < / a > <!-- ] --> <!-- [ --> < a class = "VPLink link VPNavBarMenuLink" href = "/zh/faq/" tabindex = "0" data-v-39714824 data-v-e56f3d57 > <!-- [ --> < span data-v-e56f3d57 > FAQ< / span > <!-- ] --> < / a > <!-- ] --> <!-- ] --> < / nav > < div class = "VPFlyout VPNavBarTranslations translations" data-v-2a96a3d0 data-v-88af2de4 data-v-42cb505d > < button type = "button" class = "button" aria-haspopup = "true" aria-expanded = "false" aria-label = "Change language" data-v-42cb505d > < span class = "text" data-v-42cb505d > < span class = "vpi-languages option-icon" data-v-42cb505d > < / span > <!-- --> < span class = "vpi-chevron-down text-icon" data-v-42cb505d > < / span > < / span > < / button > < div class = "menu" data-v-42cb505d > < div class = "VPMenu" data-v-42cb505d data-v-25a6cce8 > <!-- --> <!-- [ --> <!-- [ --> < div class = "items" data-v-88af2de4 > < p class = "title" data-v-88af2de4 > 简体中文< / p > <!-- [ --> < div class = "VPMenuLink" data-v-88af2de4 data-v-cd834e02 > < a class = "VPLink link" href = "/en/guide/manual-build.html" data-v-cd834e02 > <!-- [ --> < span data-v-cd834e02 > English< / span > <!-- ] --> < / a > < / div > <!-- ] --> < / div > <!-- ] --> <!-- ] --> < / div > < / div > < / div > < div class = "VPNavBarAppearance appearance" data-v-2a96a3d0 data-v-6c893767 > < button class = "VPSwitch VPSwitchAppearance" type = "button" role = "switch" title aria-checked = "false" data-v-6c893767 data-v-5337faa4 data-v-1d5665e3 > < span class = "check" data-v-1d5665e3 > < span class = "icon" data-v-1d5665e3 > <!-- [ --> < span class = "vpi-sun sun" data-v-5337faa4 > < / span > < span class = "vpi-moon moon" data-v-5337faa4 > < / span > <!-- ] --> < / span > < / span > < / button > < / div > < div class = "VPSocialLinks VPNavBarSocialLinks social-links" data-v-2a96a3d0 data-v-0394ad82 data-v-d07f11e6 > <!-- [ --> < a class = "VPSocialLink no-icon" href = "https://github.com/crazywhalecc/static-php-cli" aria-label = "github" target = "_blank" rel = "me noopener" data-v-d07f11e6 data-v-591a6b30 > < span class = "vpi-social-github" > < / span > < / a > <!-- ] --> < / div > < div class = "VPFlyout VPNavBarExtra extra" data-v-2a96a3d0 data-v-bb2aa2f0 data-v-42cb505d > < button type = "button" class = "button" aria-haspopup = "true" aria-expanded = "false" aria-label =
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # For Linux x86_64< / span > < / span >
2024-08-09 08:57:37 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # For Linux aarch64< / span > < / span >
2024-08-09 08:57:37 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # macOS x86_64 (Intel)< / span > < / span >
2024-08-09 08:57:37 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # macOS aarch64 (Apple)< / span > < / span >
2024-08-09 08:57:37 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # Windows (x86_64, win10 build 17063 or later)< / span > < / span >
2024-08-09 08:57:37 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2025-03-08 02:05:41 +00:00
< span class = "line" > < / span >
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # 对于中国大陆地区等网络环境特殊的用户,可使用镜像站加快下载速度< / span > < / span >
2025-06-12 04:49:10 +00:00
< 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=" /path/to/your/static-php-cli/bin:$PATH" < / 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # Remember change your composer executable path. For M1/M2 Chip mac, " /opt/homebrew/bin/" , for Intel mac, " /usr/local/bin/" . 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;" > & & < / 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 >
2025-03-08 02:05:41 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # [Debian], you need to make sure your php version > = 8.4 and composer > = 2.0< / span > < / span >
2025-06-12 04:49:10 +00:00
< 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 默认安装的可能为旧版本(< = 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 >
2025-05-20 02:08:00 +00:00
< 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 >
2025-08-07 05:09:55 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2024-09-04 08:36:11 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < / span >
2024-07-13 17:20:59 +00:00
< 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;" > " curl,pcntl,xml,mbstring" < / span > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > --prefer-pre-built< / span > < / span >
< span class = "line" > < / span >
2024-07-01 02:35:17 +00:00
< 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 >
2024-11-23 04:02:48 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # 下载所有依赖包,并指定下载的 PHP 主版本, 可选: 8.1, 8.2, 8.3, 8.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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-08-05 04:02:24 +00:00
< 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;" > " php-src:https://downloads.php.net/~edorian/php-8.5.0alpha2.tar.xz" < / span > < / span >
2024-07-01 02:35:17 +00:00
< span class = "line" > < / span >
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # 指定下载旧版本的 curl 库< / span > < / span >
2025-06-12 04:49:10 +00:00
< 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;" > " curl:https://curl.se/download/curl-7.88.1.tar.gz" < / 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 >
2024-09-04 16:01:32 +00:00
< 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;" > " php-src:master:https://github.com/php/php-src.git" < / span > < / span >
< span class = "line" > < / span >
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # 从 swoole-src 仓库下载 master 分支的最新代码,而不是发行版< / span > < / span >
2025-06-12 04:49:10 +00:00
< 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;" > " swoole:master:https://github.com/swoole/swoole-src.git" < / 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-09-05 09:53:03 +00:00
< 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 sapi( php-fpm, 用于和其他传统的 fpm 架构的软件如 nginx 配合使用)< / li > < li > < code > --build-cgi< / code > : 构建一个 cgi sapi( cgi, 可用于传统的 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2024-11-23 04:02:48 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2024-11-23 04:02:48 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # build< / span > < / span >
2025-06-19 11:32:15 +00:00
< 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;" > " memory_limit=4G" < / span > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > -I< / span > < spa
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > echo< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > " < ?php echo ' hello' ;" < / span > < span style = "--shiki-light:#D73A49;--shiki-dark:#F97583;" > > < / 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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;" > " a=b" < / span > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > -I< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > " foo=bar" < / span > < / span >
< span class = "line" > < / span >
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # 使用 ini 文件指定(-N 是 --with-ini-file 的简写)< / span > < / span >
2025-06-12 04:49:10 +00:00
< 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2025-03-07 02:46:39 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 < lib-name> < / code > : 从依赖库的源码中读取版本(仅特定依赖库可用)< / li > < li > < code > dev:ext-ver < ext-name> < / code > : 从扩展的源码中读取对应版本(仅特定扩展可用)< / li > < li > < code > dev:pack-lib < lib-name> < / 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 >
2024-07-01 02:35:17 +00:00
< 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 >
2025-06-19 07:57:56 +00:00
< 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 & & 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() === ' your_event_name' )< / 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 源码解压后触发<
2024-07-01 02:35:17 +00:00
< span class = "line" > < span style = "--shiki-light:#D73A49;--shiki-dark:#F97583;" > < ?< / 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;" > ' before-php-buildconf' < / 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;" > ' /php-src/sapi/cli/php_cli.c' < / span > < span style = "--shiki-light:#24292E;--shiki-dark:#E1E4E8;" > ,< / span > < / span >
< span class = "line" > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > ' sapi_module-> php_ini_ignore_cwd = 1;' < / span > < span style = "--shiki-light:#24292E;--shiki-dark:#E1E4E8;" > ,< / span > < / span >
< span class = "line" > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > ' sapi_module-> php_ini_ignore_cwd = 0;' < / span > < / span >
< span class = "line" > < span style = "--shiki-light:#24292E;--shiki-dark:#E1E4E8;" > );< / span > < / span >
2025-06-12 04:49:10 +00:00
< 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;" > ' memory_limit=8G' < / span > < span style = "--shiki-light:#D73A49;--shiki-dark:#F97583;" > > < / 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 >
2024-07-01 02:35:17 +00:00
< span class = "line" > < span > Loaded Configuration File => /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 >
2025-06-12 04:49:10 +00:00
< span class = "line" > < span > memory_limit => 8G => 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 > -> getPatchPoint()< / code > : 获取当前的注入点名称< / li > < li > < code > -> getOption(string $key, $default = null)< / code > : 获取命令行和编译时的选项< / li > < li > < code > -> getPHPVersionID()< / code > : 获取当前编译的 PHP 版本 ID< / li > < li > < code > -> getPHPVersion()< / code > : 获取当前编译的 PHP 版本号< / li > < li > < code > -> setOption(string $key, $value)< / code > : 设定选项< / li > < li > < code > -> 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 < source-name> < / code > 删除指定的源码,然后使用 < code > download < source-name> < / 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-p
2024-12-13 07:06:19 +00:00
< 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 >
2025-06-12 04:49:10 +00:00
< 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 >
2024-12-13 07:06:19 +00:00
< span class = "line" > < span style = "--shiki-light:#D73A49;--shiki-dark:#F97583;" > #include< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > < sapi/embed/php_embed.h> < / 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;" > & < / span > < span style = "--shiki-light:#24292E;--shiki-dark:#E1E4E8;" > file_handle,< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > " embed.php" < / 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;" > & < / 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;" > " Failed to execute PHP script.< / span > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > \n< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > " < / 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 >
2025-06-12 04:49:10 +00:00
< 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;" > < ?< / span > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > php< / span > < span style = "--shiki-light:#24292E;--shiki-dark:#E1E4E8;" > < / span > < / span >
2024-12-13 07:06:19 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > // embed.php< / span > < / span >
2025-06-12 04:49:10 +00:00
< span class = "line" > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > echo< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > " Hello world!< / span > < span style = "--shiki-light:#005CC5;--shiki-dark:#79B8FF;" > \n< / span > < span style = "--shiki-light:#032F62;--shiki-dark:#9ECBFF;" > " < / 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 >
2024-12-13 07:06:19 +00:00
< 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 >
2025-08-31 05:45:13 +00:00
< span class = "line" > < span style = "--shiki-light:#6A737D;--shiki-dark:#6A737D;" > # out: Hello world!< / span > < / span > < / code > < / pre > < / div > < / div > < / div > < / main > < footer class = "VPDocFooter" data-v-7011f0d8 data-v-e257564d > <!-- [ --> <!-- ] --> <!-- --> < nav class = "prev-next" aria-labelledby = "doc-footer-aria-label" data-v-e257564d > < span class = "visually-hidden" id = "doc-footer-aria-label" data-v-e257564d > Pager< / span > < div class = "pager" data-v-e257564d > < a class = "VPLink link pager-link prev" href = "/zh/guide/" data-v-e257564d > <!-- [ --> < span class = "desc" data-v-e257564d > Previous page< / span > < span class = "title" data-v-e257564d > 指南< / span > <!-- ] --> < / a > < / div > < div class = "pager" data-v-e257564d > < a class = "VPLink link pager-link next" href = "/zh/guide/action-build.html" data-v-e257564d > <!-- [ --> < span class = "desc" data-v-e257564d > Next page< / span > < span class = "title" data-v-e257564d > Actions 构建< / span > <!-- ] --> < / a > < / div > < / nav > < / footer > <!-- [ --> <!-- ] --> < / div > < / div > < / div > <!-- [ --> <!-- ] --> < / div > < / div > < footer class = "VPFooter has-sidebar" data-v-1df9f90f data-v-c3855bb3 > < div class = "container" data-v-c3855bb3 > < p class = "message" data-v-c3855bb3 > Released under the MIT License.< / p > < p class = "copyright" data-v-c3855bb3 > Copyright © 2023-present crazywhalecc< / p > < / div > < / footer > <!-- [ --> <!-- ] --> < / div > < / div >
2025-11-04 13:59:40 +00:00
< script > w i n d o w . _ _ V P _ H A S H _ M A P _ _ = J S O N . p a r s e ( " { \ " d e p s - c r a f t - y m l . m d \ " : \ " D q N Y V 3 B 0 \ " , \ " d e p s - m a p - e x t . m d \ " : \ " C b R 9 N H h U \ " , \ " d e p s - m a p - l i b . m d \ " : \ " 8 H i h n P W z \ " , \ " e n _ c o n t r i b u t i n g _ i n d e x . m d \ " : \ " f C A 6 l X n W \ " , \ " e n _ d e v e l o p _ c r a f t - y m l . m d \ " : \ " C i 9 7 s s L 7 \ " , \ " e n _ d e v e l o p _ d o c t o r - m o d u l e . m d \ " : \ " B T D y p - a K \ " , \ " e n _ d e v e l o p _ i n d e x . m d \ " : \ " D U N r U V P 9 \ " , \ " e n _ d e v e l o p _ p h p - s r c - c h a n g e s . m d \ " : \ " d N 8 a S i w g \ " , \ " e n _ d e v e l o p _ s o u r c e - m o d u l e . m d \ " : \ " C T C L l q s P \ " , \ " e n _ d e v e l o p _ s t r u c t u r e . m d \ " : \ " X 2 J I d 3 N 9 \ " , \ " e n _ d e v e l o p _ s y s t e m - b u i l d - t o o l s . m d \ " : \ " B m Q h y T l e \ " , \ " e n _ f a q _ i n d e x . m d \ " : \ " C _ V Q H F 6 y \ " , \ " e n _ g u i d e _ a c t i o n - b u i l d . m d \ " : \ " D n z q 6 g N C \ " , \ " e n _ g u i d e _ b u i l d - o n - w i n d o w s . m d \ " : \ " D i Y V S a P G \ " , \ " e n _ g u i d e _ b u i l d - w i t h - g l i b c . m d \ " : \ " C k V R 7 5 n 5 \ " , \ " e n _ g u i d e _ c l i - g e n e r a t o r . m d \ " : \ " U T a 1 f Y P O \ " , \ " e n _ g u i d e _ d e p s - m a p . m d \ " : \ " D E 2 p Y G 8 h \ " , \ " e n _ g u i d e _ e n v - v a r s . m d \ " : \ " 5 1 D Q 7 b v x \ " , \ " e n _ g u i d e _ e x t e n s i o n - n o t e s . m d \ " : \ " C H F G R i K x \ " , \ " e n _ g u i d e _ e x t e n s i o n s . m d \ " : \ " C s v a B C H e \ " , \ " e n _ g u i d e _ i n d e x . m d \ " : \ " C 0 g w K W b 1 \ " , \ " e n _ g u i d e _ m a n u a l - b u i l d . m d \ " : \ " D P s G I I 1 D \ " , \ " e n _ g u i d e _ t r o u b l e s h o o t i n g . m d \ " : \ " D 1 9 j R B 1 K \ " , \ " e n _ i n d e x . m d \ " : \ " Y h l q 3 F h s \ " , \ " e x t e n s i o n - n o t e s . m d \ " : \ " B B 7 X l w 1 w \ " , \ " e x t e n s i o n s . m d \ " : \ " 2 1 F a h c J c \ " , \ " i n d e x . m d \ " : \ " C Z z e 5 I _ S \ " , \ " z h _ c o n t r i b u t i n g _ i n d e x . m d \ " : \ " f i i K M X n j \ " , \ " z h _ d e v e l o p _ c r a f t - y m l . m d \ " : \ " C A U u 6 v 3 8 \ " , \ " z h _ d e v e l o p _ d o c t o r - m o d u l e . m d \ " : \ " 1 N R X I I N s \ " , \ " z h _ d e v e l o p _ i n d e x . m d \ " : \ " C R x n J Z D t \ " , \ " z h _ d e v e l o p _ p h p - s r c - c h a n g e s . m d \ " : \ " C w V U c 0 o E \ " , \ " z h _ d e v e l o p _ s o u r c e - m o d u l e . m d \ " : \ " C S 1 V B o _ 1 \ " , \ " z h _ d e v e l o p _ s t r u c t u r e . m d \ " : \ " C E d 1 R y c Z \ " , \ " z h _ d e v e l o p _ s y s t e m - b u i l d - t o o l s . m d \ " : \ " C Q 4 B v P V a \ " , \ " z h _ f a q _ i n d e x . m d \ " : \ " D y N J g 3 P Z \ " , \ " z h _ g u i d e _ a c t i o n - b u i l d . m d \ " : \ " C Q 3 V f 3 i 9 \ " , \ " z h _ g u i d e _ b u i l d - o n - w i n d o w s . m d \ " : \ " o o g W r P n _ \ " , \ " z h _ g u i d e _ b u i l d - w i t h - g l i b c . m d \ " : \ " C H X y K 6 1 r \ " , \ " z h _ g u i d e _ c l i - g e n e r a t o r . m d \ " : \ " B C k v p m P R \ " , \ " z h _ g u i d e _ d e p s - m a p . m d \ " : \ " D A k L V l b R \ " , \ " z h _ g u i d e _ e n v - v a r s . m d \ " : \ " C t N l q G k 4 \ " , \ " z h _ g u i d e _ e x t e n s i o n - n o t e s . m d \ " : \ " B C w D j B Z H \ " , \ " z h _ g u i d e _ e x t e n s i o n s . m d \ " : \ " D 7 7 m p x g k \ " , \ " z h _ g u i d e _ i n d e x . m d \ " : \ " B B G j n h q - \ " , \ " z h _ g u i d e _ m a n u a l - b u i l d . m d \ " : \ " C 3 i k s v H w \ " , \ " z h _ g u i d e _ t r o u b l e s h o o t i n g . m d \ " : \ " B R Q L W 2 W P \ " , \ " z h _ i n d e x . m d \ " : \ " D O 7 u d O c 6 \ " } " ) ; w i n d o w . _ _ V P _ S I T E _ D A T A _ _ = J S O N . p a r s e ( " { \ " l a n g \ " : \ " e n - U S \ " , \ " d i r \ " : \ " l t r \ " , \ " t i t l e \ " : \ " S t a t i c P H P \ " , \ " d e s c r i p t i o n \ " : \ " B u i l d s i n g l e s t a t i c P H P b i n a r y , w i t h P H P p r o j e c t t o g e t h e r , w i t h p o p u l a r e x t e n s i o n s i n c l u d e d . \ " , \ " b a s e \ " : \ " / \ " , \ " h e a d \ " : [ ] , \ " r o u t e r \ " : { \ " p r e f e t c h L i n k s \ " : t r u e } , \ " a p p e a r a n c e \ " : t r u e , \ " t h e m e C o n f i g \ " : { \ " l o g o \ " : \ " / i m a g e s / s t a t i c - p h p _ n o b g . p n g \ " , \ " n a v \ " : [ ] , \ " s o c i a l L i n k s \ " : [ { \ " i c o n \ " : \ " g i t h u b \ " , \ " l i n k \ " : \ " h t t p s : / / g i t h u b . c o m / c r a z y w h a l e c c / s t a t i c - p h p - c l i \ " } ] , \ " f o o t e r \ " : { \ " m e s s a g e \ " : \ " R e l e a s e d u n d e r t h e M I T L i c e n s e . \ " , \ " c o p y r i g h t \ " : \ " C o p y r i g h t © 2 0 2 3 - p r e s e n t c r a z y w h a l e c c \ " } , \ " s e a r c h \ " : { \ " p r o v i d e r \ " : \ " a l g o l i a \ " , \ " o p t i o n s \ " : { \ " a p p I d \ " : \ " I H J H U B 1 S F 1 \ " , \ " a p i K e y \ " : \ " 8 2 6 6 d 3 1 c c 2 f f b d 0 e 0 5 9 f 1 c 6 e 5 b d a f 8 f c \ " , \ " i n d e x N a m e \ " : \ " s t a t i c - p h p d o c s \ " } } } , \ " l o c a l e s \ " : { \ " e n \ " : { \ " l a b e l \ " : \ " E n g l i s h \ " , \ " l a n g \ " : \ " e n \ " , \ " t h e m e C o n f i g \ " : { \ " n a v \ " : [ { \ " t e x t \ " : \ " G u i d e \ " , \ " l i n k \ " : \ " / e n / g u i d e / \ " } , { \ " t e x t \ " : \ " A d v a n c e d \ " , \ " l i n k \ " : \ " / e n / d e v e l o p / \ " } , { \ " t e x t \ " : \ " C o n t r i b u t i n g \ " , \ " l i n k \ " : \ " / e n / c o n t r i b u t i n g / \ " } , { \ " t e x t \ " : \ " F A Q \ " , \ " l i n k \ " : \ " / e n / f a q / \ " } ] , \ " s i d e b a r \ " : { \ " / e n / g u i d e / \ " : [ { \ " t e x t \ " : \ " B a s i c B u i l d G u i d e s \ " , \ " i t e m s \ " : [ { \ " t e x t \ " : \ " G u i d e \ " , \ " l i n k \ " : \ " / e n / g u i d e / \ " } , { \ " t e x t \ " : \ " B u i l d ( L o c a l ) \ " , \ " l i n k \ " : \ " / e n / g u i d e / m a n u a l - b u i l d \ " } , { \ " t e x t \ " : \ " B u i l d ( C I ) \ " , \ " l i n k \ " : \ " / e n / g u i d e / a c t i o n - b u i l d \ " } , { \ " t e x t \ " : \ " S u p p o r t e d E x t e n s i o n s \ " , \ " l i n k \ " : \ " / e n / g u i d e / e x t e n s i o n s \ " } , { \ " t e x t \ " : \ " E x t e n s i o n N o t e s \ " , \ " l i n k \ " : \ " / e n / g u i d e / e x t e n s i o n - n o t e s \ " } , { \ " t e x t \ " : \ " B u i l d C o m m a n d G e n e r a t o r \ " , \ " l i n k \ " : \ " / e n / g u i d e / c l i - g e n e r a t o r \ " } , { \ " t e x t \ " : \ " E n v i r o n m e n t V a r i a b l e s \ " , \ " l i n k \ " : \ " / e n / g u i d e / e n v - v a r s \ " , \ " c o l l a p s e d \ " : t r u e } , { \ " t e x t \ " : \ " D e p e n d e n c y T a b l e \ " , \ " l i n k \ " : \ " / e n / g u i d e / d e p s - m a p \ " } ] } , { \ " t e x t \ " : \ " E x t e n d e d B u i l d G u i d e s \ " , \ " i t e m s \ " : [ { \ " t e x t \ " : \ " T r o u b l e s h o o t i n g \ " , \ " l i n k \ " : \ " / e n / g u i d e / t r o u b l e s h o o t i n g \ " } , { \ " t e x t \ " : \ " B u i l d o n W i n d o w s \ " , \ " l i n k \ " : \ " / e n / g u i d e / b u i l d - o n - w i n d o w s \ " } , { \ " t e x t \ " : \ " B u i l d w i t h G N U l i b c \ " , \ " l i n k \ " : \ " / e n / g u i d e / b u i l d - w i t h - g l i b c \ " } ] } ] , \ " / e n / d e v e l o p / \ " : [ { \ " t e x t \ " : \ " D e v e l o p m e n t \ " , \ " i t e m s \ " : [ { \ " t e x t \ " : \ " G e t S t a r t e d \ " , \ " l i n k \ " : \ " / e n / d e v e l o p / \ " } , { \ " t e x t \ " : \ " P r o j e c t S t r u c t u r e \ " , \ " l i n k \ " : \ " / e n / d e v e l o p / s t r u c t u r e \ " } , { \ " t e x t \ " : \ " P H P S o u r c e M o d i f i c a
2024-07-01 02:35:17 +00:00
< / body >
< / html >