Skip to content

Build single static PHP binary, with PHP project together, with popular extensions included.

License

Notifications You must be signed in to change notification settings

mechelon/static-php-cli

 
 

Repository files navigation

static-php-cli

Compile A Statically Linked PHP With Swoole and other Extensions. English README

编译纯静态的 PHP Binary 二进制文件,带有各种扩展,让 PHP-cli 应用变得更便携!

同时可以使用 micro 二进制文件,将 PHP 源码和 PHP 二进制构建为一个文件分发!(由 dixyes/phpmicro 提供支持)

注:只能编译 CLI 模式,暂不支持 CGI 和 FPM 模式。

此分支为重构的新版,如果你在找纯 Bash 编写的旧版本,请到 bash-version 分支

Version License

编译环境需求

是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。 但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含 tokenizer 扩展和 PHP 版本大于等于 8.0 即可。

  • Linux
    • 支持架构: aarch64, amd64
    • 支持发行版: alpine, ubuntu, centos
    • 依赖工具: make, bison, flex, pkg-config, git, autoconf, automake, tar, unzip, gzip, bzip2, cmake
  • macOS
    • 支持架构: arm64, x86_64
    • 依赖工具: make, bison, flex, pkg-config, git, autoconf, automake, tar, unzip, xz, gzip, bzip2, cmake
  • Windows
    • 支持架构: x86_64
    • 依赖工具: (TODO)
  • PHP
    • 支持编译版本: 7.4, 8.0, 8.1, 8.2
    • 项目依赖版本:8.0, 8.1, 8.2

使用(WIP)

请先根据下方扩展列表选择你要编译的扩展。

支持的扩展情况

扩展支持列表

使用 Actions 构建

使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。

  1. Fork 本项目。
  2. 进入项目的 Actions,选择 CI。
  3. 选择 Run workflow,填入你要编译的 PHP 版本、目标类型、扩展列表。
  4. 等待大约一段时间后,进入对应的任务中,获取 Artifacts

如果你选择了 debug,则会在构建时输出所有日志,包括编译的日志,以供排查错误。

手动构建

# 克隆本项目
git clone https://github.com/crazywhalecc/static-php-cli.git
cd static-php-cli
composer update
chmod +x bin/spc
# 检查环境依赖,并根据提示的命令安装缺失的编译工具(TODO)
# ./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-all

你也可以使用参数 --with-php=x.y 来指定下载的 PHP 版本,目前支持 7.4 ~ 8.2:

./bin/spc fetch --with-php=8.2 --all

如果出现了任何错误,可以使用 --debug 参数来展示完整的输出日志,以供排查错误:

./bin/spc build openssl --debug
./bin/spc fetch --all --debug

使用 php-cli

php-cli 是一个静态的二进制文件,类似 Go、Rust 语言编译后的单个可移植的二进制文件。

采用参数 --build-all 或不添加 --build-micro 参数时,最后编译结果会输出一个 ./php 的二进制文件,此文件可分发、可直接使用。 该文件编译后会存放在 buildroot/bin/ 目录中,名称为 php,拷贝出来即可。

cd buildroot/
./php -v
./php -m
./php your_code.php

使用 micro.sfx

phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 dixyes/phpmicro

采用项目参数 --build-all--build-micro 时,最后编译结果会输出一个 ./micro.sfx 的文件,此文件需要配合你的 PHP 源码使用。 该文件编译后会存放在 source/php-src/sapi/micro/ 目录中,拷贝出来即可。

使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。

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 环境下运行。

项目支持情况

  • 基础结构编写(采用 symfony/console
  • 错误处理
  • macOS 支持
  • Windows 支持
  • Linux 支持
  • PHP 7.4 支持

更多功能和特性正在陆续支持中,详见:crazywhalecc#32

贡献

目前支持的扩展较少,如果缺少你需要的扩展,可发起 Issue。如果你对本项目较熟悉,也欢迎为本项目发起 Pull Request。

贡献基本原则如下:

  • 项目采用了 php-cs-fixer、phpstan 作为代码规范工具,贡献前请对更新的代码执行 composer analyzecomposer cs-fix
  • 涉及到其他开源库的部分应提供对应库的协议,同时对配置文件在修改后采用命令 sort-config 排序。有关排序的命令,见文档。
  • 应遵循命名规范,例如扩展名称应采取 PHP 内注册的扩展名本身,外部库名应遵循项目本身的名称,内部逻辑的函数、类名、变量等应遵循驼峰、下划线等格式,禁止同一模块混用。
  • 涉及编译外部库的命令和 Patch 时应注意兼容不同操作系统。

开源协议

本项目依据旧版本惯例采用 MIT License 开源,自身的部分代码引用或修改自以下项目:

因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。 请在编译完成后,使用命令 dump-license(TODO) 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。

进阶

本项目重构分支为模块化编写。

This section will be improved after refactor version released.

About

Build single static PHP binary, with PHP project together, with popular extensions included.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • PHP 100.0%