diff --git a/README-en.md b/README-en.md index a6ce40fd..505fd70a 100755 --- a/README-en.md +++ b/README-en.md @@ -1,260 +1,3 @@ # static-php-cli -Build single static PHP binary, with PHP project together, with popular extensions included. - -The project name is static-php-cli, but it actually supports cli, fpm, micro and embed SAPI 😎 - -Compile a purely static php-cli binary file with various extensions to make PHP applications more portable! (cli SAPI) - -2023-05-02 15 53 13 - -You can also use the micro binary file to combine php binary and php source code into one for distribution! (micro SAPI) - -2023-05-02 15 52 33 - -> This SAPI feature is from the [Fork](https://github.com/crazywhalecc/phpmicro) of [dixyes/phpmicro](https://github.com/dixyes/phpmicro). - - -[![Version](https://img.shields.io/badge/Version-2.0--rc5-pink.svg?style=flat-square)]() -[![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)]() -[![](https://img.shields.io/github/actions/workflow/status/crazywhalecc/static-php-cli/build-linux-x86_64.yml?branch=refactor&label=Linux%20Build&style=flat-square)](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build.yml) -[![](https://img.shields.io/github/actions/workflow/status/crazywhalecc/static-php-cli/build-macos-x86_64.yml?branch=refactor&label=macOS%20Build&style=flat-square)](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build.yml) - -[![](https://img.shields.io/badge/Extension%20Counter-55+-yellow.svg?style=flat-square)]() -[![](https://img.shields.io/github/search/crazywhalecc/static-php-cli/TODO?label=TODO%20Counter&style=flat-square)]() - -## Compilation Requirements - -Yes, this project is written in PHP, pretty funny. -But static-php-cli runtime only requires an environment above PHP 8.1 and `mbstring`, `pcntl` extension. - -Here is the architecture support status, where `CI` represents support for GitHub Action builds, -`Local` represents support for local builds, and blank represents not currently supported. - -| | x86_64 | aarch64 | -|---------|-----------|-----------| -| macOS | CI, Local | Local | -| Linux | CI, Local | CI, Local | -| Windows | | | -| FreeBSD | Local | Local | - -> macOS-arm64 is not supported for GitHub Actions, if you are going to build on arm, you can build it manually on your own machine. - -Currently supported PHP versions for compilation are: `7.3`, `7.4`, `8.0`, `8.1`, `8.2`, `8.3`. - -## Docs - -docs here: . - -## Simple Usage - -Please first select the extension you want to compile based on the extension list below. - -### Direct Download - -If you don't compile yourself, you can download pre-compiled artifact from Actions, or from self-hosted server: [Here](https://dl.static-php.dev/static-php-cli/common/) - -> self-hosted server contains extensions: `bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip` - -### Supported Extensions - -[Supported Extension List](https://static-php.dev/en/guide/extensions.html) - -> If there is no extension you need here, you can submit an issue. - -### GitHub Actions Build - -Use GitHub Action to easily build a statically compiled PHP and phpmicro, -and at the same time define the extensions to be compiled by yourself. - -1. Fork me. -2. Go to the Actions of the project and select `CI`. -3. Select `Run workflow`, fill in the PHP version you want to compile, the target type, and the list of extensions. (extensions comma separated, e.g. `bcmath,curl,mbstring`) -4. After waiting for about a period of time, enter the corresponding task and get `Artifacts`. - -If you enable `debug`, all logs will be output at build time, including compiled logs, for troubleshooting. - -- When using ubuntu-latest, it will build linux-x86_64 binary. -- When using macos-latest, it will build macOS-x86_64 binary. - -### Manual Build - -Clone repo first: - -```bash -git clone https://github.com/crazywhalecc/static-php-cli.git -``` - -If you have not installed php on your system, you can use package management to install PHP (such as brew, apt, yum, apk etc.). - -And you can also download single-file php binary and composer using command `bin/setup-runtime`. -The PHP runtime for static-php-cli itself will be downloaded at `bin/php`, and composer is at `bin/composer`. - -```bash -cd static-php-cli -chmod +x bin/setup-runtime -# It will download php-cli from self-hosted server and composer from getcomposer.org -./bin/setup-runtime - -# Use this php runtime to run static-php-cli compiler -./bin/php bin/spc - -# Use composer -./bin/php bin/composer -``` - -Basic usage for building php and micro with some extensions: - -```bash -cd static-php-cli -composer update -chmod +x bin/spc -# Check system tool dependencies, fix them automatically -./bin/spc doctor -# fetch all libraries -./bin/spc fetch --all -# with bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl extension, build both CLI and phpmicro SAPI -./bin/spc build bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl --build-cli --build-micro -``` - -You can also use the parameter `--with-php=x.y` to specify the downloaded PHP version, currently supports 7.4 ~ 8.2: - -```bash -# Using PHP >= 8.0 is recommended, because PHP7 cannot use phpmicro -./bin/spc fetch --with-php=8.2 --all -``` - -Now we support `cli`, `micro`, `fpm`, you can use one or more of the following parameters to specify the compiled SAPI: - -- `--build-cli`: build static cli executable -- `--build-micro`: build static phpmicro self-extracted executable -- `--build-fpm`: build static fpm binary -- `--build-embed`: build embed (libphp) -- `--build-all`: build all - -If anything goes wrong, use `--debug` option to display full terminal output: - -```bash -./bin/spc build openssl,pcntl,mbstring --debug --build-all -./bin/spc fetch --all --debug -``` - -In addition, we build NTS by default. If you are going to build ZTS version, just add `--enable-zts` option. - -```bash -./bin/spc build openssl,pcntl --build-all --enable-zts -``` - -Adding option `--no-strip` can produce binaries with debug symbols, in order to debug (using gdb). Disabling strip will increase the size of static binary. - -### php-cli Usage - -> php-cli is a single static binary, you can use it like normal php installed on your system. - -When using the parameter `--build-cli` or `--build-all`, -the final compilation result will output a binary file named `./php`, -which can be distributed and used directly. -This file will be located in the directory `buildroot/bin/`, copy it out for use. - -```bash -cd buildroot/bin/ -./php -v # check version -./php -m # check extensions -./php your_code.php # run your php code -./php your_project.phar # run your phar (project archive) -``` - -### micro.sfx Usage - -> phpmicro is a SelF-extracted eXecutable SAPI module, -> provided by [dixyes/phpmicro](https://github.com/dixyes/phpmicro). -> It can put php runtime and your source code together. - -When using the parameter `--build-all` or `--build-micro`, -the final compilation result will output a file named `./micro.sfx`, -which needs to be used with your PHP source code like `code.php`. -This file will be located in the path `buildroot/bin/micro.sfx`, simply copy it out for use. - -Prepare your project source code, which can be a single PHP file or a Phar file, for use. - -```bash -echo " code.php -cat micro.sfx code.php > single-app && chmod +x single-app -./single-app - -# If packing a PHAR file, replace code.php with the Phar file path. -``` - -> In some cases, PHAR files may not run in a micro environment. - -### php-fpm Usage - -When using the parameter `--build-all` or `--build-fpm`, -the final compilation result will output a file named `./php-fpm`, -This file will be located in the path `buildroot/bin/`, simply copy it out for use. - -In normal Linux distributions and macOS systems, the package manager will automatically generate a default fpm configuration file after installing php-fpm. -Because php-fpm must specify a configuration file before running, the php-fpm compiled by this project will not have any configuration files, so you need to write `php-fpm.conf` and `pool.conf` configuration files yourself. - -Specifying `php-fpm.conf` can use the command parameter `-y`, for example: `./php-fpm -y php-fpm.conf`. - -### Embed Usage - -When using the project parameters `--build-embed` or `--build-all`, -the final compilation result will output a `libphp.a`, `php-config` and a series of header files, -stored in `buildroot/`. You can introduce them in your other projects. - -If you know [embed SAPI](https://github.com/php/php-src/tree/master/sapi/embed), you should know how to use it. -You may require the introduction of other libraries during compilation, -you can use `buildroot/bin/php-config` to obtain the compile-time configuration. - -For an advanced example of how to use this feature, take a look at [how to use it to build a static version of FrankenPHP](https://github.com/dunglas/frankenphp/blob/main/docs/static.md). - -## Contribution - -If the extension you need is missing, you can create an issue. -If you are familiar with this project, you are also welcome to initiate a pull request. - -The basic principles for contributing are as follows: - -- This project uses php-cs-fixer and phpstan as code formatting tools. Before contributing, please run `composer analyse` and `composer cs-fix` on the updated code. -- If other open source libraries are involved, the corresponding licenses should be provided. - Also, configuration files should be sorted using the command `sort-config` after modification. - For more information about sorting commands, see the documentation. -- Naming conventions should be followed, such as using the extension name registered in PHP for the extension name itself, - and external library names should follow the project's own naming conventions. For internal logic functions, class names, variables, etc., - camelCase and underscore formats should be followed, and mixing within the same module is prohibited. -- When compiling external libraries and creating patches, compatibility with different operating systems should be considered. - -If you want to contribute document content, please go to [crazywhalecc/static-php-cli-docs](https://github.com/crazywhalecc/static-php-cli-docs). - -Part of the English document is written by me, and part is translated by Google, -and there may be inaccurate descriptions, strange or offensive expressions. -If you are a native English speaker, some corrections to the documentation are welcome. - - -## Sponsor this project - -You can sponsor my project on [this page](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md). - -## Open-Source License - -This project itself is based on MIT License, -some newly added extensions and dependencies may originate from the following projects (including but not limited to), -and the headers of these code files will also be given additional instructions LICENSE and AUTHOR: - -- [dixyes/lwmbs](https://github.com/dixyes/lwmbs) (Mulun Permissive License) -- [swoole/swoole-cli](https://github.com/swoole/swoole-cli) (Apache 2.0 LICENSE+SWOOLE-CLI LICENSE) - -Due to the special nature of this project, -many other open source projects such as curl and protobuf will be used during the project compilation process, -and they all have their own open source licenses. - -Please use the `bin/spc dump-license` command to export the open source licenses used in the project after compilation, -and comply with the corresponding project's LICENSE. - -## Advanced - -The refactoring branch of this project is written modularly. -If you are interested in this project and want to join the development, -you can refer to the [Contribution Guide](https://static-php.dev) of the documentation to contribute code or documentation. +English README has been moved to [README.md](README.md). diff --git a/README-zh.md b/README-zh.md new file mode 100755 index 00000000..a03053d1 --- /dev/null +++ b/README-zh.md @@ -0,0 +1,248 @@ +# static-php-cli + +Build single static PHP binary, with PHP project together, with popular extensions included. + +🌐 **[中文](README-zh.md)** | **[English](README.md)** + +编译纯静态的 PHP Binary 二进制文件,带有各种扩展,让 PHP-cli 应用变得更便携!(cli SAPI) + +截屏2023-05-02 15 53 13 + +同时可以使用 micro 二进制文件,将 PHP 源码和 PHP 二进制构建为一个文件分发!(micro SAPI) + +截屏2023-05-02 15 52 33 + +> 该 SAPI 源自 [dixyes/phpmicro](https://github.com/dixyes/phpmicro) 的 [Fork 仓库](https://github.com/crazywhalecc/phpmicro)。 + +[![Version](https://img.shields.io/badge/Version-2.0--rc5-pink.svg?style=flat-square)]() +[![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)]() +[![](https://img.shields.io/github/actions/workflow/status/crazywhalecc/static-php-cli/build-linux-x86_64.yml?branch=refactor&label=Linux%20Build&style=flat-square)](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build.yml) +[![](https://img.shields.io/github/actions/workflow/status/crazywhalecc/static-php-cli/build-macos-x86_64.yml?branch=refactor&label=macOS%20Build&style=flat-square)](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build.yml) +[![](https://img.shields.io/badge/Extension%20Counter-55+-yellow.svg?style=flat-square)]() +[![](https://img.shields.io/github/search/crazywhalecc/static-php-cli/TODO?label=TODO%20Counter&style=flat-square)]() + +> 项目名称是 static-php-cli,但其实支持 cli、fpm、micro 和 embed SAPI 😎 + +## 编译环境需求 + +是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。 +但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含 mbstring、pcntl 扩展和 PHP 版本大于等于 8.1 即可。 + +下面是架构支持情况,`CI` 代表支持 GitHub Action 构建,`Local` 代表支持本地构建,空 代表暂不支持。 + +| | x86_64 | aarch64 | +|---------|-----------|-----------| +| macOS | CI, Local | Local | +| Linux | CI, Local | CI, Local | +| Windows | | | +| FreeBSD | Local | Local | + +> macOS-arm64 因 GitHub 暂未提供 arm runner,如果要构建 arm 二进制,可以使用手动构建。 + +目前支持编译的 PHP 版本为:`7.3`,`7.4`,`8.0`,`8.1`,`8.2`,`8.3`。 + +## 文档 + +点击这里查看文档:。 + +## 使用 + +请先根据下方扩展列表选择你要编译的扩展。 + +### 自托管直接下载 + +如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:[进入](https://dl.static-php.dev/static-php-cli/common/) + +> 自托管的服务器默认包含的扩展有:`bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip` + +### 支持的扩展情况 + +[扩展支持列表](https://static-php.dev/zh/guide/extensions.html) + +> 如果这里没有你需要的扩展,可以提交 Issue。 + +### 使用 Actions 构建 + +使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。 + +1. Fork 本项目。 +2. 进入项目的 Actions,选择 CI。 +3. 选择 `Run workflow`,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 `bcmath,curl,mbstring`) +4. 等待大约一段时间后,进入对应的任务中,获取 `Artifacts`。 + +如果你选择了 `debug`,则会在构建时输出所有日志,包括编译的日志,以供排查错误。 + +### 手动构建(使用 SPC 二进制) + +本项目提供了一个 static-php-cli 的二进制文件,你可以直接下载对应平台的二进制文件,然后使用它来构建静态的 PHP。目前 `spc` 二进制支持的平台有 Linux 和 macOS。 + +下面是从 GitHub Action 下载的方法: + +1. 进入 [GitHub Action](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml)。 +2. 选择一个最新的构建任务,进入后选择 `Artifacts`,下载对应平台的二进制文件。 +3. 解压 `.zip` 文件。解压后,为其添加执行权限:`chmod +x ./spc`。 + +你也可以从自托管的服务器下载二进制文件:[进入](https://dl.static-php.dev/static-php-cli/spc-bin/nightly/)。 + +### 手动构建(使用源码) + +先克隆本项目: + +```bash +git clone https://github.com/crazywhalecc/static-php-cli.git +``` + +如果你本机没有安装 PHP,你需要先使用包管理(例如 brew、apt、yum、apk 等)安装 php。 + +你也可以通过 `bin/setup-runtime` 命令下载静态编译好的 php-cli 和 Composer。下载的 php 和 Composer 将保存为 `bin/php` 和 `bin/composer`。 + +```bash +cd static-php-cli +chmod +x bin/setup-runtime +./bin/setup-runtime + +# 使用独立的 php 运行 static-php-cli +./bin/php bin/spc + +# 使用 composer +./bin/php bin/composer + +# 初始化本项目 +cd static-php-cli +composer update +chmod +x bin/spc +``` + +### 使用 static-php-cli 命令行程序 + +下面是使用 static-php-cli 编译静态 php 和 micro 的基础用法: + +> 如果你使用的是打包好的 `spc` 二进制,你需要将下列命令的 `bin/spc` 替换为 `./spc`。 + +```bash +# 检查环境依赖,并根据提示的命令安装缺失的编译工具 +./bin/spc doctor +# 拉取所有依赖库 +./bin/spc fetch --all +# 构建包含 bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl 扩展的 php-cli 和 micro.sfx +./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro +``` + +你也可以使用参数 `--with-php=x.y` 来指定下载的 PHP 版本,目前支持 7.3 ~ 8.2: + +```bash +# 优先考虑使用 >= 8.0 的 PHP 版本,因为 phpmicro 不支持在 PHP7 中构建 +./bin/spc download --with-php=8.2 --all +``` + +其中,目前支持构建 cli,micro,fpm 三种静态二进制,使用以下参数的一个或多个来指定编译的 SAPI: + +- `--build-cli`:构建 cli 二进制 +- `--build-micro`:构建 phpmicro 自执行二进制 +- `--build-fpm`:构建 fpm +- `--build-embed`:构建 embed(libphp) +- `--build-all`:构建所有 + +如果出现了任何错误,可以使用 `--debug` 参数来展示完整的输出日志,以供排查错误: + +```bash +./bin/spc build openssl,pcntl,mbstring --debug --build-all +./bin/spc fetch --all --debug +``` + +此外,默认编译的 PHP 为 NTS 版本。如需编译线程安全版本(ZTS),只需添加参数 `--enable-zts` 即可。 + +```bash +./bin/spc build openssl,pcntl --build-all --enable-zts +``` + +同时,你也可以使用参数 `--no-strip` 来关闭裁剪,关闭裁剪后可以使用 gdb 等工具调试,但这样会让静态二进制体积变大。 + +### 使用 php-cli + +> php-cli 是一个静态的二进制文件,类似 Go、Rust 语言编译后的单个可移植的二进制文件。 + +采用参数 `--build-cli` 或`--build-all` 参数时,最后编译结果会输出一个 `./php` 的二进制文件,此文件可分发、可直接使用。 +该文件编译后会存放在 `buildroot/bin/` 目录中,名称为 `php`,拷贝出来即可。 + +```bash +cd buildroot/bin/ +./php -v # 检查版本 +./php -m # 检查编译的扩展 +./php your_code.php # 运行代码 +./php your_project.phar # 运行打包为 phar 单文件的项目 +``` + +### 使用 micro.sfx + +> phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 [dixyes/phpmicro](https://github.com/dixyes/phpmicro)。 + +采用项目参数 `--build-micro` 或 `--build-all` 时,最后编译结果会输出一个 `./micro.sfx` 的文件,此文件需要配合你的 PHP 源码使用。 +该文件编译后会存放在 `buildroot/bin/` 目录中,拷贝出来即可。 + +使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。 + +```bash +echo " code.php +cat micro.sfx code.php > single-app && chmod +x single-app +./single-app +``` + +如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可。 +你可以使用 [box-project/box](https://github.com/box-project/box) 将你的 CLI 项目打包为 Phar, +然后将它与 phpmicro 结合,生成独立可执行的二进制文件。 + +```bash +# 使用 static-php-cli 生成的 micro.sfx 结合,也可以直接使用 cat 命令结合它们 +bin/spc micro:combine my-app.phar +cat buildroot/bin/micro.sfx my-app.phar > my-app && chmod +x my-app + +# 使用 micro:combine 结合可以将 INI 选项注入到二进制中 +bin/spc micro:combine my-app.phar -I "memory_limit=4G" -I "disable_functions=system" --output my-app-2 +``` + +> 有些情况下的 phar 文件或 PHP 项目可能无法在 micro 环境下运行。 + +### 使用 php-fpm + +采用项目参数 `--build-fpm` 或 `--build-all` 时,最后编译结果会输出一个 `./php-fpm` 的文件。 +该文件存放在 `buildroot/bin/` 目录,拷贝出来即可使用。 + +在正常的 Linux 发行版和 macOS 系统中,安装 php-fpm 后包管理会自动生成默认的 fpm 配置文件。 +因为 php-fpm 必须指定配置文件才可启动,本项目编译的 php-fpm 不会带任何配置文件,所以需自行编写 `php-fpm.conf` 和 `pool.conf` 配置文件。 + +指定 `php-fpm.conf` 可以使用命令参数 `-y`,例如:`./php-fpm -y php-fpm.conf`。 + +### 使用 php-embed + +采用项目参数 `--build-embed` 或 `--build-all` 时,最后编译结果会输出一个 `libphp.a`、`php-config` 以及一系列头文件,存放在 `buildroot/`,你可以在你的其他代码中引入它们。 + +如果你知道 [embed SAPI](https://github.com/php/php-src/tree/master/sapi/embed),你应该知道如何使用它。对于有可能编译用到引入其他库的问题,你可以使用 `buildroot/bin/php-config` 来获取编译时的配置。 + +另外,有关如何使用此功能的高级示例,请查看[如何使用它构建 FrankenPHP 的静态版本](https://github.com/dunglas/frankenphp/blob/main/docs/static.md)。 + +## 贡献 + +如果缺少你需要的扩展,可发起 Issue。如果你对本项目较熟悉,也欢迎为本项目发起 Pull Request。 + +另外,添加新扩展的贡献方式,可以参考下方 `进阶`。 + +如果你想贡献文档内容,请到项目仓库 [crazywhalecc/static-php-cli-docs](https://github.com/crazywhalecc/static-php-cli-docs) 贡献。 + +## 赞助本项目 + +你可以在 [我的个人赞助页](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md) 支持我和我的项目。 + +## 开源协议 + +本项目依据旧版本惯例采用 MIT License 开源,部分扩展的集成编译命令参考或修改自以下项目: + +- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)(木兰宽松许可证) +- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)(Apache 2.0 LICENSE、SWOOLE-CLI LICENSE) + +因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。 +请在编译完成后,使用命令 `bin/spc dump-license` 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。 + +## 进阶 + +本项目重构分支为模块化编写。如果你对本项目感兴趣,想加入开发,可以参照文档的 [贡献指南](https://static-php.dev) 贡献代码或文档。 diff --git a/README.md b/README.md index ca3d0f0f..3bd471fc 100755 --- a/README.md +++ b/README.md @@ -2,35 +2,35 @@ Build single static PHP binary, with PHP project together, with popular extensions included. -**If you are using English, see [English README](README-en.md).** +🌐 **[中文](README-zh.md)** | **[English](README.md)** -> 项目别名:standalone-php-compiler +The project name is static-php-cli, but it actually supports cli, fpm, micro and embed SAPI 😎 -编译纯静态的 PHP Binary 二进制文件,带有各种扩展,让 PHP-cli 应用变得更便携!(cli SAPI) +Compile a purely static php-cli binary file with various extensions to make PHP applications more portable! (cli SAPI) -截屏2023-05-02 15 53 13 +2023-05-02 15 53 13 -同时可以使用 micro 二进制文件,将 PHP 源码和 PHP 二进制构建为一个文件分发!(micro SAPI) +You can also use the micro binary file to combine php binary and php source code into one for distribution! (micro SAPI) -截屏2023-05-02 15 52 33 +2023-05-02 15 52 33 -> 该 SAPI 源自 [dixyes/phpmicro](https://github.com/dixyes/phpmicro) 的 [Fork 仓库](https://github.com/crazywhalecc/phpmicro)。 +> This SAPI feature is from the [Fork](https://github.com/crazywhalecc/phpmicro) of [dixyes/phpmicro](https://github.com/dixyes/phpmicro). -[![Version](https://img.shields.io/badge/Version-2.0--rc5-pink.svg?style=flat-square)]() +[![Version](https://img.shields.io/badge/Version-2.0--rc7-pink.svg?style=flat-square)]() [![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)]() [![](https://img.shields.io/github/actions/workflow/status/crazywhalecc/static-php-cli/build-linux-x86_64.yml?branch=refactor&label=Linux%20Build&style=flat-square)](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build.yml) [![](https://img.shields.io/github/actions/workflow/status/crazywhalecc/static-php-cli/build-macos-x86_64.yml?branch=refactor&label=macOS%20Build&style=flat-square)](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build.yml) + [![](https://img.shields.io/badge/Extension%20Counter-55+-yellow.svg?style=flat-square)]() [![](https://img.shields.io/github/search/crazywhalecc/static-php-cli/TODO?label=TODO%20Counter&style=flat-square)]() -> 项目名称是 static-php-cli,但其实支持 cli、fpm、micro 和 embed SAPI 😎 +## Compilation Requirements -## 编译环境需求 +Yes, this project is written in PHP, pretty funny. +But static-php-cli runtime only requires an environment above PHP 8.1 and `mbstring`, `pcntl` extension. -是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。 -但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含 mbstring、pcntl 扩展和 PHP 版本大于等于 8.1 即可。 - -下面是架构支持情况,`CI` 代表支持 GitHub Action 构建,`Local` 代表支持本地构建,空 代表暂不支持。 +Here is the architecture support status, where `CI` represents support for GitHub Action builds, +`Local` represents support for local builds, and blank represents not currently supported. | | x86_64 | aarch64 | |---------|-----------|-----------| @@ -39,191 +39,244 @@ Build single static PHP binary, with PHP project together, with popular extensio | Windows | | | | FreeBSD | Local | Local | -> macOS-arm64 因 GitHub 暂未提供 arm runner,如果要构建 arm 二进制,可以使用手动构建。 +> macOS-arm64 is not supported for GitHub Actions, if you are going to build on arm, you can build it manually on your own machine. -目前支持编译的 PHP 版本为:`7.3`,`7.4`,`8.0`,`8.1`,`8.2`,`8.3`。 +Currently supported PHP versions for compilation are: `7.3`, `7.4`, `8.0`, `8.1`, `8.2`, `8.3`. -## 文档 +## Docs -点击这里查看文档:。 +docs here: . -## 使用 +## Simple Usage -请先根据下方扩展列表选择你要编译的扩展。 +Please first select the extension you want to compile based on the extension list below. -### 自托管直接下载 +### Direct Download -如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:[进入](https://dl.static-php.dev/static-php-cli/common/) +If you don't compile yourself, you can download example pre-compiled artifact from Actions, or from self-hosted server: [Here](https://dl.static-php.dev/static-php-cli/common/) -> 自托管的服务器默认包含的扩展有:`bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip` +> self-hosted server contains extensions: `bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip` -### 支持的扩展情况 +### Supported Extensions -[扩展支持列表](https://static-php.dev/zh/guide/extensions.html) +[Supported Extension List](https://static-php.dev/en/guide/extensions.html) -> 如果这里没有你需要的扩展,可以提交 Issue。 +> If an extension you need is missing, you can submit an issue. -### 使用 Actions 构建 +### GitHub Actions Build -使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。 +Use GitHub Action to easily build a statically compiled PHP and phpmicro, +and at the same time define the extensions to be compiled by yourself. -1. Fork 本项目。 -2. 进入项目的 Actions,选择 CI。 -3. 选择 `Run workflow`,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 `bcmath,curl,mbstring`) -4. 等待大约一段时间后,进入对应的任务中,获取 `Artifacts`。 +1. Fork me. +2. Go to the Actions of the project and select `CI`. +3. Select `Run workflow`, fill in the PHP version you want to compile, the target type, and the list of extensions. (extensions comma separated, e.g. `bcmath,curl,mbstring`) +4. After waiting for about a period of time, enter the corresponding task and get `Artifacts`. -如果你选择了 `debug`,则会在构建时输出所有日志,包括编译的日志,以供排查错误。 +If you enable `debug`, all logs will be output at build time, including compiled logs, for troubleshooting. -### 手动构建 +- When using ubuntu-latest, it will build linux-x86_64 binary. +- When using macos-latest, it will build macOS-x86_64 binary. -先克隆本项目: +### Manual build (using SPC binary) + +This project provides a binary file of static-php-cli. +You can directly download the binary file of the corresponding platform and then use it to build static PHP. +Currently, the platforms supported by `spc` binary are Linux and macOS. + +Here's how to download from GitHub Actions: + +1. Enter [GitHub Actions](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml). +2. Select the latest build task, select `Artifacts`, and download the binary file of the corresponding platform. +3. Unzip the `.zip` file. After decompressing, add execution permissions to it: `chmod +x ./spc`. + +You can also download binaries from a self-hosted server: [enter](https://dl.static-php.dev/static-php-cli/spc-bin/nightly/). + +### Manual build (using source code) + +Clone repo first: ```bash git clone https://github.com/crazywhalecc/static-php-cli.git ``` -如果你本机没有安装 PHP,你需要先使用包管理(例如 brew、apt、yum、apk 等)安装 php。 +If you have not installed php on your system, you can use package management to install PHP (such as brew, apt, yum, apk etc.). -你也可以通过 `bin/setup-runtime` 命令下载静态编译好的 php-cli 和 Composer。下载的 php 和 Composer 将保存为 `bin/php` 和 `bin/composer`。 +And you can also download single-file php binary and composer using command `bin/setup-runtime`. +The PHP runtime for static-php-cli itself will be downloaded at `bin/php`, and composer is at `bin/composer`. ```bash cd static-php-cli chmod +x bin/setup-runtime +# It will download php-cli from self-hosted server and composer from getcomposer.org ./bin/setup-runtime -# 使用独立的 php 运行 static-php-cli +# Use this php runtime to run static-php-cli compiler ./bin/php bin/spc -# 使用 composer +# Use composer ./bin/php bin/composer -``` -下面是使用 static-php-cli 编译静态 php 和 micro 的基础用法: - -```bash -# 克隆本项目 +# Initialize this project cd static-php-cli composer update chmod +x bin/spc -# 检查环境依赖,并根据提示的命令安装缺失的编译工具 -./bin/spc doctor -# 拉取所有依赖库 -./bin/spc fetch --all -# 构建包含 bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl 扩展的 php-cli 和 micro.sfx -./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro ``` -你也可以使用参数 `--with-php=x.y` 来指定下载的 PHP 版本,目前支持 7.3 ~ 8.3: +### Use static-php-cli + +Basic usage for building php and micro with some extensions: + +> If you are using the packaged `spc` binary, you need to replace `bin/spc` with `./spc` in the following commands. ```bash -# 优先考虑使用 >= 8.0 的 PHP 版本,因为 phpmicro 不支持在 PHP7 中构建 +# Check system tool dependencies, fix them automatically +./bin/spc doctor +# fetch all libraries +./bin/spc fetch --all +# with bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl extension, build both CLI and phpmicro SAPI +./bin/spc build bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl --build-cli --build-micro +``` + +You can also use the parameter `--with-php=x.y` to specify the downloaded PHP version, currently supports 7.4 ~ 8.2: + +```bash +# Using PHP >= 8.0 is recommended, because PHP7 cannot use phpmicro ./bin/spc fetch --with-php=8.2 --all ``` -其中,目前支持构建 cli,micro,fpm 三种静态二进制,使用以下参数的一个或多个来指定编译的 SAPI: +Now we support `cli`, `micro`, `fpm`, you can use one or more of the following parameters to specify the compiled SAPI: -- `--build-cli`:构建 cli 二进制 -- `--build-micro`:构建 phpmicro 自执行二进制 -- `--build-fpm`:构建 fpm -- `--build-embed`:构建 embed(libphp) -- `--build-all`:构建所有 +- `--build-cli`: build static cli executable +- `--build-micro`: build static phpmicro self-extracted executable +- `--build-fpm`: build static fpm binary +- `--build-embed`: build embed (libphp) +- `--build-all`: build all -如果出现了任何错误,可以使用 `--debug` 参数来展示完整的输出日志,以供排查错误: +If anything goes wrong, use `--debug` option to display full terminal output: ```bash ./bin/spc build openssl,pcntl,mbstring --debug --build-all ./bin/spc fetch --all --debug ``` -此外,默认编译的 PHP 为 NTS 版本。如需编译线程安全版本(ZTS),只需添加参数 `--enable-zts` 即可。 +In addition, we build NTS by default. If you are going to build ZTS version, just add `--enable-zts` option. ```bash ./bin/spc build openssl,pcntl --build-all --enable-zts ``` -同时,你也可以使用参数 `--no-strip` 来关闭裁剪,关闭裁剪后可以使用 gdb 等工具调试,但这样会让静态二进制体积变大。 +Adding option `--no-strip` can produce binaries with debug symbols, in order to debug (using gdb). Disabling strip will increase the size of static binary. -### 使用 php-cli +### php-cli Usage -> php-cli 是一个静态的二进制文件,类似 Go、Rust 语言编译后的单个可移植的二进制文件。 +> php-cli is a single static binary, you can use it like normal php installed on your system. -采用参数 `--build-cli` 或`--build-all` 参数时,最后编译结果会输出一个 `./php` 的二进制文件,此文件可分发、可直接使用。 -该文件编译后会存放在 `buildroot/bin/` 目录中,名称为 `php`,拷贝出来即可。 +When using the parameter `--build-cli` or `--build-all`, +the final compilation result will output a binary file named `./php`, +which can be distributed and used directly. +This file will be located in the directory `buildroot/bin/`, copy it out for use. ```bash cd buildroot/bin/ -./php -v # 检查版本 -./php -m # 检查编译的扩展 -./php your_code.php # 运行代码 -./php your_project.phar # 运行打包为 phar 单文件的项目 +./php -v # check version +./php -m # check extensions +./php your_code.php # run your php code +./php your_project.phar # run your phar (project archive) ``` -### 使用 micro.sfx +### micro.sfx Usage -> phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 [dixyes/phpmicro](https://github.com/dixyes/phpmicro)。 +> phpmicro is a SelF-extracted eXecutable SAPI module, +> provided by [dixyes/phpmicro](https://github.com/dixyes/phpmicro). +> It can put php runtime and your source code together. -采用项目参数 `--build-micro` 或 `--build-all` 时,最后编译结果会输出一个 `./micro.sfx` 的文件,此文件需要配合你的 PHP 源码使用。 -该文件编译后会存放在 `buildroot/bin/` 目录中,拷贝出来即可。 +When using the parameter `--build-all` or `--build-micro`, +the final compilation result will output a file named `./micro.sfx`, +which needs to be used with your PHP source code like `code.php`. +This file will be located in the path `buildroot/bin/micro.sfx`, simply copy it out for use. -使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。 +Prepare your project source code, which can be a single PHP file or a Phar file, for use. ```bash echo " code.php cat micro.sfx code.php > single-app && chmod +x single-app ./single-app - -# 如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可 ``` -> 有些情况下的 phar 文件可能无法在 micro 环境下运行。 +If you package a PHAR file, just replace `code.php` with the phar file path. +You can use [box-project/box](https://github.com/box-project/box) to package your CLI project as Phar, +It is then combined with phpmicro to produce a standalone executable binary. -### 使用 php-fpm +```bash +# Use the micro.sfx generated by static-php-cli to combine, +bin/spc micro:combine my-app.phar +# or you can directly use the cat command to combine them. +cat buildroot/bin/micro.sfx my-app.phar > my-app && chmod +x my-app -采用项目参数 `--build-fpm` 或 `--build-all` 时,最后编译结果会输出一个 `./php-fpm` 的文件。 -该文件存放在 `buildroot/bin/` 目录,拷贝出来即可使用。 +# Use micro:combine combination to inject INI options into the binary. +bin/spc micro:combine my-app.phar -I "memory_limit=4G" -I "disable_functions=system" --output my-app-2 +``` -在正常的 Linux 发行版和 macOS 系统中,安装 php-fpm 后包管理会自动生成默认的 fpm 配置文件。 -因为 php-fpm 必须指定配置文件才可启动,本项目编译的 php-fpm 不会带任何配置文件,所以需自行编写 `php-fpm.conf` 和 `pool.conf` 配置文件。 +> In some cases, PHAR files may not run in a micro environment. -指定 `php-fpm.conf` 可以使用命令参数 `-y`,例如:`./php-fpm -y php-fpm.conf`。 +### php-fpm Usage -### 使用 php-embed +When using the parameter `--build-all` or `--build-fpm`, +the final compilation result will output a file named `./php-fpm`, +This file will be located in the path `buildroot/bin/`, simply copy it out for use. -采用项目参数 `--build-embed` 或 `--build-all` 时,最后编译结果会输出一个 `libphp.a`、`php-config` 以及一系列头文件,存放在 `buildroot/`,你可以在你的其他代码中引入它们。 +In normal Linux distributions and macOS systems, the package manager will automatically generate a default fpm configuration file after installing php-fpm. +Because php-fpm must specify a configuration file before running, the php-fpm compiled by this project will not have any configuration files, so you need to write `php-fpm.conf` and `pool.conf` configuration files yourself. -如果你知道 [embed SAPI](https://github.com/php/php-src/tree/master/sapi/embed),你应该知道如何使用它。对于有可能编译用到引入其他库的问题,你可以使用 `buildroot/bin/php-config` 来获取编译时的配置。 +Specifying `php-fpm.conf` can use the command parameter `-y`, for example: `./php-fpm -y php-fpm.conf`. -另外,有关如何使用此功能的高级示例,请查看[如何使用它构建 FrankenPHP 的静态版本](https://github.com/dunglas/frankenphp/blob/main/docs/static.md)。 +### Embed Usage -## 贡献 +When using the project parameters `--build-embed` or `--build-all`, +the final compilation result will output a `libphp.a`, `php-config` and a series of header files, +stored in `buildroot/`. You can introduce them in your other projects. -如果缺少你需要的扩展,可发起 Issue。如果你对本项目较熟悉,也欢迎为本项目发起 Pull Request。 +If you know [embed SAPI](https://github.com/php/php-src/tree/master/sapi/embed), you should know how to use it. +You may require the introduction of other libraries during compilation, +you can use `buildroot/bin/php-config` to obtain the compile-time configuration. -贡献基本原则如下: +For an advanced example of how to use this feature, take a look at [how to use it to build a static version of FrankenPHP](https://github.com/dunglas/frankenphp/blob/main/docs/static.md). -- 项目采用了 php-cs-fixer、phpstan 作为代码规范工具,贡献前请对更新的代码执行 `composer analyze` 和 `composer cs-fix`。 -- 涉及到其他开源库的部分应提供对应库的协议,同时对配置文件在修改后采用命令 `sort-config` 排序。有关排序的命令,见文档。 -- 应遵循命名规范,例如扩展名称应采取 PHP 内注册的扩展名本身,外部库名应遵循项目本身的名称,内部逻辑的函数、类名、变量等应遵循驼峰、下划线等格式,禁止同一模块混用。 -- 涉及编译外部库的命令和 Patch 时应注意兼容不同操作系统。 +## Contribution -另外,添加新扩展的贡献方式,可以参考下方 `进阶`。 +If the extension you need is missing, you can create an issue. +If you are familiar with this project, you are also welcome to initiate a pull request. -如果你想贡献文档内容,请到项目仓库 [crazywhalecc/static-php-cli-docs](https://github.com/crazywhalecc/static-php-cli-docs) 贡献。 +If you want to contribute document content, please go to [crazywhalecc/static-php-cli-docs](https://github.com/crazywhalecc/static-php-cli-docs). -## 赞助本项目 +Part of the English document is written by me, and part is translated by Google, +and there may be inaccurate descriptions, strange or offensive expressions. +If you are a native English speaker, some corrections to the documentation are welcome. -你可以在 [我的个人赞助页](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md) 支持我和我的项目。 -## 开源协议 +## Sponsor this project -本项目依据旧版本惯例采用 MIT License 开源,部分扩展的集成编译命令参考或修改自以下项目: +You can sponsor my project on [this page](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md). -- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)(木兰宽松许可证) -- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)(Apache 2.0 LICENSE、SWOOLE-CLI LICENSE) +## Open-Source License -因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。 -请在编译完成后,使用命令 `bin/spc dump-license` 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。 +This project itself is based on MIT License, +some newly added extensions and dependencies may originate from the following projects (including but not limited to), +and the headers of these code files will also be given additional instructions LICENSE and AUTHOR: -## 进阶 +- [dixyes/lwmbs](https://github.com/dixyes/lwmbs) (Mulun Permissive License) +- [swoole/swoole-cli](https://github.com/swoole/swoole-cli) (Apache 2.0 LICENSE+SWOOLE-CLI LICENSE) -本项目重构分支为模块化编写。如果你对本项目感兴趣,想加入开发,可以参照文档的 [贡献指南](https://static-php.dev) 贡献代码或文档。 +Due to the special nature of this project, +many other open source projects such as curl and protobuf will be used during the project compilation process, +and they all have their own open source licenses. + +Please use the `bin/spc dump-license` command to export the open source licenses used in the project after compilation, +and comply with the corresponding project's LICENSE. + +## Advanced + +The refactoring branch of this project is written modularly. +If you are interested in this project and want to join the development, +you can refer to the [Contribution Guide](https://static-php.dev) of the documentation to contribute code or documentation.