static-php-cli/README.md

225 lines
11 KiB
Markdown
Raw Normal View History

2021-05-07 10:06:00 +08:00
# static-php-cli
2023-03-19 14:05:30 +08:00
2023-09-06 16:05:38 +08:00
Build single static PHP binary, with PHP project together, with popular extensions included.
2023-04-21 19:10:23 +08:00
2023-07-21 16:34:40 +08:00
**If you are using English, see [English README](README-en.md).**
2021-05-06 14:44:16 +08:00
2023-05-02 15:54:52 +08:00
编译纯静态的 PHP Binary 二进制文件,带有各种扩展,让 PHP-cli 应用变得更便携cli SAPI
2021-06-05 23:48:37 +08:00
2023-05-02 15:54:52 +08:00
<img width="600" alt="截屏2023-05-02 15 53 13" src="https://user-images.githubusercontent.com/20330940/235610282-23e58d68-bd35-4092-8465-171cff2d5ba8.png">
同时可以使用 micro 二进制文件,将 PHP 源码和 PHP 二进制构建为一个文件分发!(由 [dixyes/phpmicro](https://github.com/dixyes/phpmicro) 提供支持micro SAPI
<img width="600" alt="截屏2023-05-02 15 52 33" src="https://user-images.githubusercontent.com/20330940/235610318-2ef4e3f1-278b-4ca4-99f4-b38120efc395.png">
2022-05-16 17:02:57 +08:00
2023-08-20 20:32:07 +08:00
[![Version](https://img.shields.io/badge/Version-2.0--rc5-pink.svg?style=flat-square)]()
2023-04-09 13:58:09 +08:00
[![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)]()
2023-04-30 14:29:56 +08:00
[![](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)
2023-07-22 17:34:33 +08:00
[![](https://img.shields.io/badge/Extension%20Counter-55+-yellow.svg?style=flat-square)]()
2023-04-22 22:52:02 +08:00
[![](https://img.shields.io/github/search/crazywhalecc/static-php-cli/TODO?label=TODO%20Counter&style=flat-square)]()
2021-04-28 00:03:14 +08:00
2023-09-12 22:44:19 +08:00
> 项目名称是 static-php-cli但其实支持 cli、fpm、micro 和 embed SAPI 😎
2021-07-28 14:26:28 +08:00
## 编译环境需求
2022-05-16 17:02:57 +08:00
2023-03-18 14:19:45 +08:00
是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。
但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含 mbstring、pcntl 扩展和 PHP 版本大于等于 8.1 即可。
2022-04-17 22:07:56 +08:00
2023-04-15 21:44:34 +08:00
下面是架构支持情况,`CI` 代表支持 GitHub Action 构建,`Local` 代表支持本地构建,空 代表暂不支持。
| | x86_64 | aarch64 |
|---------|-----------|-----------|
| macOS | CI, Local | Local |
| Linux | CI, Local | CI, Local |
| Windows | | |
2023-04-15 21:44:34 +08:00
2023-04-30 12:55:49 +08:00
> macOS-arm64 因 GitHub 暂未提供 arm runner如果要构建 arm 二进制,可以使用手动构建。
2023-04-15 21:44:34 +08:00
2023-08-22 18:33:34 +08:00
目前支持编译的 PHP 版本为:`7.3``7.4``8.0``8.1``8.2``8.3`
2022-05-16 17:02:57 +08:00
2023-07-17 17:59:44 +08:00
## 文档
2023-09-26 18:29:45 +08:00
点击这里查看文档:<https://static-php.dev>
2023-07-17 17:59:44 +08:00
2023-04-14 13:35:44 +08:00
## 使用
2022-05-16 17:02:57 +08:00
2023-04-08 22:35:10 +08:00
请先根据下方扩展列表选择你要编译的扩展。
2022-05-15 00:57:14 +08:00
2023-05-01 12:57:31 +08:00
### 自托管直接下载
如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact也可以从自托管的服务器下载[进入](https://dl.static-php.dev/static-php-cli/common/)
2023-05-01 12:57:31 +08:00
> 自托管的服务器默认包含的扩展有:`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`
2023-04-14 13:35:44 +08:00
### 支持的扩展情况
2023-04-03 21:30:32 +08:00
2023-09-26 18:29:45 +08:00
[扩展支持列表](https://static-php.dev/zh/guide/extensions.html)
2023-04-03 21:30:32 +08:00
2023-04-22 22:41:00 +08:00
> 如果这里没有你需要的扩展,可以提交 Issue。
2023-04-08 22:35:10 +08:00
### 使用 Actions 构建
使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro同时可以自行定义要编译的扩展。
1. Fork 本项目。
2. 进入项目的 Actions选择 CI。
2023-04-15 18:58:29 +08:00
3. 选择 `Run workflow`,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 `bcmath,curl,mbstring`
2023-04-08 22:35:10 +08:00
4. 等待大约一段时间后,进入对应的任务中,获取 `Artifacts`
2023-04-09 13:38:41 +08:00
如果你选择了 `debug`,则会在构建时输出所有日志,包括编译的日志,以供排查错误。
2023-04-08 22:35:10 +08:00
### 手动构建
2023-03-19 14:05:30 +08:00
2023-04-22 22:18:44 +08:00
先克隆本项目:
2022-05-15 00:57:14 +08:00
```bash
2023-04-08 22:35:10 +08:00
git clone https://github.com/crazywhalecc/static-php-cli.git
2023-04-22 22:18:44 +08:00
```
2023-06-02 23:39:01 +08:00
如果你本机没有安装 PHP你需要先使用包管理例如 brew、apt、yum、apk 等)安装 php。
2023-04-22 22:18:44 +08:00
2023-06-02 23:39:01 +08:00
你也可以通过 `bin/setup-runtime` 命令下载静态编译好的 php-cli 和 Composer。下载的 php 和 Composer 将保存为 `bin/php``bin/composer`
2023-04-22 22:18:44 +08:00
```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
```
下面是使用 static-php-cli 编译静态 php 和 micro 的基础用法:
```bash
# 克隆本项目
2023-04-08 22:35:10 +08:00
cd static-php-cli
composer update
chmod +x bin/spc
2023-07-17 21:44:17 +08:00
# 检查环境依赖,并根据提示的命令安装缺失的编译工具
2023-04-22 22:18:44 +08:00
./bin/spc doctor
2023-03-18 14:19:45 +08:00
# 拉取所有依赖库
2023-04-08 22:35:10 +08:00
./bin/spc fetch --all
2023-03-19 14:13:24 +08:00
# 构建包含 bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl 扩展的 php-cli 和 micro.sfx
2023-04-23 20:29:50 +08:00
./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro
2022-05-15 00:57:14 +08:00
```
2023-08-22 18:33:34 +08:00
你也可以使用参数 `--with-php=x.y` 来指定下载的 PHP 版本,目前支持 7.3 ~ 8.3
2023-04-09 13:38:41 +08:00
```bash
2023-08-22 18:33:34 +08:00
# 优先考虑使用 >= 8.0 的 PHP 版本,因为 phpmicro 不支持在 PHP7 中构建
2023-04-09 13:38:41 +08:00
./bin/spc fetch --with-php=8.2 --all
```
2023-04-23 20:29:50 +08:00
其中,目前支持构建 climicrofpm 三种静态二进制,使用以下参数的一个或多个来指定编译的 SAPI
- `--build-cli`:构建 cli 二进制
- `--build-micro`:构建 phpmicro 自执行二进制
- `--build-fpm`:构建 fpm
2023-09-12 22:44:19 +08:00
- `--build-embed`:构建 embedlibphp
2023-04-23 20:29:50 +08:00
- `--build-all`:构建所有
2023-04-09 13:38:41 +08:00
如果出现了任何错误,可以使用 `--debug` 参数来展示完整的输出日志,以供排查错误:
```bash
2023-04-23 20:29:50 +08:00
./bin/spc build openssl,pcntl,mbstring --debug --build-all
2023-04-09 13:38:41 +08:00
./bin/spc fetch --all --debug
```
2023-05-17 23:07:39 +08:00
此外,默认编译的 PHP 为 NTS 版本。如需编译线程安全版本ZTS只需添加参数 `--enable-zts` 即可。
```bash
./bin/spc build openssl,pcntl --build-all --enable-zts
```
同时,你也可以使用参数 `--no-strip` 来关闭裁剪,关闭裁剪后可以使用 gdb 等工具调试,但这样会让静态二进制体积变大。
2023-03-19 14:05:30 +08:00
### 使用 php-cli
2023-03-31 00:16:40 +08:00
> php-cli 是一个静态的二进制文件,类似 Go、Rust 语言编译后的单个可移植的二进制文件。
2023-04-23 20:29:50 +08:00
采用参数 `--build-cli``--build-all` 参数时,最后编译结果会输出一个 `./php` 的二进制文件,此文件可分发、可直接使用。
2023-03-31 00:16:40 +08:00
该文件编译后会存放在 `buildroot/bin/` 目录中,名称为 `php`,拷贝出来即可。
2023-03-19 14:05:30 +08:00
```bash
2023-04-22 22:25:01 +08:00
cd buildroot/bin/
./php -v # 检查版本
./php -m # 检查编译的扩展
./php your_code.php # 运行代码
./php your_project.phar # 运行打包为 phar 单文件的项目
2023-03-19 14:05:30 +08:00
```
### 使用 micro.sfx
2023-03-31 00:16:40 +08:00
> phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 [dixyes/phpmicro](https://github.com/dixyes/phpmicro)。
2023-04-23 20:29:50 +08:00
采用项目参数 `--build-micro``--build-all` 时,最后编译结果会输出一个 `./micro.sfx` 的文件,此文件需要配合你的 PHP 源码使用。
该文件编译后会存放在 `buildroot/bin/` 目录中,拷贝出来即可。
2023-03-19 14:05:30 +08:00
使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。
```bash
echo "<?php echo 'Hello world' . PHP_EOL;" > code.php
cat micro.sfx code.php > single-app && chmod +x single-app
./single-app
# 如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可
```
> 有些情况下的 phar 文件可能无法在 micro 环境下运行。
2023-04-23 20:29:50 +08:00
### 使用 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`
2023-09-12 22:44:19 +08:00
### 使用 php-embed
采用项目参数 `--build-embed``--build-all` 时,最后编译结果会输出一个 `libphp.a``php-config` 以及一系列头文件,存放在 `buildroot/`,你可以在你的其他代码中引入它们。
2023-09-13 10:01:08 +08:00
如果你知道 [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)。
2023-09-12 22:44:19 +08:00
2023-03-19 14:05:30 +08:00
## 贡献
2023-09-12 22:44:19 +08:00
如果缺少你需要的扩展,可发起 Issue。如果你对本项目较熟悉也欢迎为本项目发起 Pull Request。
2023-03-19 14:05:30 +08:00
贡献基本原则如下:
- 项目采用了 php-cs-fixer、phpstan 作为代码规范工具,贡献前请对更新的代码执行 `composer analyze``composer cs-fix`
- 涉及到其他开源库的部分应提供对应库的协议,同时对配置文件在修改后采用命令 `sort-config` 排序。有关排序的命令,见文档。
- 应遵循命名规范,例如扩展名称应采取 PHP 内注册的扩展名本身,外部库名应遵循项目本身的名称,内部逻辑的函数、类名、变量等应遵循驼峰、下划线等格式,禁止同一模块混用。
- 涉及编译外部库的命令和 Patch 时应注意兼容不同操作系统。
2023-04-23 13:30:56 +08:00
另外,添加新扩展的贡献方式,可以参考下方 `进阶`
2023-07-17 18:39:34 +08:00
如果你想贡献文档内容,请到项目仓库 [crazywhalecc/static-php-cli-docs](https://github.com/crazywhalecc/static-php-cli-docs) 贡献。
2023-05-29 23:49:55 +08:00
## 赞助本项目
你可以在 [我的个人赞助页](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md) 支持我和我的项目。
2023-03-18 14:19:45 +08:00
## 开源协议
2023-09-12 22:44:19 +08:00
本项目依据旧版本惯例采用 MIT License 开源,部分扩展的集成编译命令参考或修改自以下项目:
2023-03-18 14:19:45 +08:00
2023-03-18 17:44:23 +08:00
- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)(木兰宽松许可证)
2023-03-31 00:16:40 +08:00
- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)Apache 2.0 LICENSE、SWOOLE-CLI LICENSE
2023-03-18 14:19:45 +08:00
因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。
2023-06-02 09:55:13 +08:00
请在编译完成后,使用命令 `bin/spc dump-license` 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。
2023-03-31 00:16:40 +08:00
## 进阶
2023-09-26 18:29:45 +08:00
本项目重构分支为模块化编写。如果你对本项目感兴趣,想加入开发,可以参照文档的 [贡献指南](https://static-php.dev) 贡献代码或文档。