forked from https://github.com/crazywhalecc/static-php-cli
static-php-cli is a powerful tool designed for building static, standalone PHP runtime with popular extensions.
Static PHP built by static-php-cli supports cli
, fpm
, embed
and micro
SAPI.
static-php-cli also has the ability to package PHP projects along with the PHP interpreter into one single executable file.
static-php-cli (you can call it spc
) has a lot of features:
- π Build single-file php executable, without any dependencies
- π Build phpmicro self-extracted executable (glue php binary and php source code into one file)
- π Automatic build environment checker (Doctor module)
- β‘
Linux
,macOS
,FreeBSD
,Windows
support - π§ Configurable source code patches
- π Build dependency management
- π¦ Provide
spc
own standalone executable (built by spc and box) - π₯ Support many popular extensions
- πΎ UPX integration (significantly reduces binary size)
Single-file standalone php-cli:
Combine PHP code with PHP interpreter using phpmicro:
The current README contains basic usage. For all the features of static-php-cli, see https://static-php.dev .
If you don't want to build or want to test first, you can download example pre-compiled artifact from Actions, or from self-hosted server.
Below are several precompiled static-php binaries with different extension combinations, which can be downloaded directly according to your needs.
Combination | Extension Count | OS | Comment |
---|---|---|---|
common | 30+ | Linux, macOS | The binary size is about 7.5MB |
bulk | 50+ | Linux, macOS | The binary size is about 25MB |
minimal | 5 | Linux, macOS | The binary size is about 3MB |
spc-min | 5 | Windows | The binary size is about 3MB |
spc-max | 40+ | Windows | The binary size is about 8.5MB |
Linux and Windows supports UPX compression for binaries, which can reduce the size of the binary by 30% to 50%. macOS does not support UPX compression, so the size of the pre-built binaries for mac is larger.
You can say I made a PHP builder written in PHP, pretty funny. But static-php-cli runtime only requires an environment above PHP 8.1 and extensions mentioned below.
- PHP >= 8.1 (This is the version required by spc itself, not the build version)
- Extension:
mbstring,tokenizer,phar
- Supported OS with
curl
andgit
installed
Here is the supported OS and arch, where represents support for GitHub Action builds, π» represents support for local manual builds, and blank represents not currently supported.
x86_64 | aarch64 | |
---|---|---|
macOS | π» | π» |
Linux | π» | π» |
Windows | π» | |
FreeBSD | π» | π» |
Currently supported PHP versions for compilation:
β οΈ supported but not maintained by static-php-cli authorsβοΈ supported
β not supported
PHP Version | Status | Comment |
---|---|---|
7.2 | β | |
7.3 | β | phpmicro and some extensions not supported on 7.x |
7.4 | β | phpmicro and some extensions not supported on 7.x |
8.0 | PHP official has stopped maintenance of 8.0, we no longer provide backport support for version 8.0 | |
8.1 | βοΈ | PHP official has security fixes only |
8.2 | βοΈ | |
8.3 | βοΈ | |
8.4 | βοΈ |
This table shows the support status for static-php-cli in building the corresponding version, not the official PHP support status for that version.
Please first select the extension you want to compile based on the extension list below.
If an extension you need is missing, you can submit an issue.
Here is the current planned roadmap for extension support: #152 .
Use GitHub Action to easily build a statically compiled PHP, and at the same time define the extensions to be compiled by yourself.
- Fork me.
- Go to the Actions of the project and select
CI
. - 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
) - 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.
This project provides a binary file of static-php-cli: spc
.
You can use spc
binary instead of installing any runtime like golang app.
Currently, the platforms supported by spc
binary are Linux and macOS.
Download from self-hosted nightly builds using commands below:
# Download from self-hosted nightly builds (sync with main branch)
# For Linux x86_64
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
# For Linux aarch64
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-aarch64
# macOS x86_64 (Intel)
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
# macOS aarch64 (Apple)
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
# Windows (x86_64, win10 build 17063 or later)
curl.exe -fsSL -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
# Add execute perm (Linux and macOS only)
chmod +x ./spc
# Run (Linux and macOS)
./spc --version
# Run (Windows powershell)
.\spc.exe --version
Self-hosted spc
is built by GitHub Actions, you can also download from Actions artifacts here.
If you need to modify the static-php-cli source code, or have problems using the spc binary build, you can download static-php-cli using the git source code.
# just clone me!
git clone https://github.com/crazywhalecc/static-php-cli.git
If you have not installed php on your system, we recommend that you use the built-in setup-runtime to install PHP and Composer automatically.
cd static-php-cli
chmod +x bin/setup-runtime
# it will download static php (from self-hosted server) and composer (from getcomposer)
bin/setup-runtime
# initialize composer deps
bin/composer install
# chmod
chmod +x bin/spc
bin/spc --version
Basic usage for building php with some extensions:
If you are using the packaged standalone
spc
binary, you need to replacebin/spc
with./spc
or.\spc.exe
in the following commands.
# Check system tool dependencies, auto-fix them if possible
./bin/spc doctor --auto-fix
# fetch all libraries
./bin/spc download --all
# only fetch necessary sources by needed extensions (recommended)
./bin/spc download --for-extensions="openssl,pcntl,mbstring,pdo_sqlite"
# download pre-built libraries first (save time for compiling dependencies)
./bin/spc download --for-extensions="openssl,curl,mbstring,mbregex" --prefer-pre-built
# download different PHP version (--with-php=x.y or --with-php=x.y.z, recommend 8.1 ~ 8.3)
./bin/spc download --for-extensions="openssl,curl,mbstring" --with-php=8.1
# 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
# build thread-safe (ZTS) version (--enable-zts)
./bin/spc build "curl,phar" --enable-zts --build-cli
# build, pack executable with UPX (linux and windows only) (reduce binary size for 30~50%)
./bin/spc build "curl,phar" --enable-zts --build-cli --with-upx-pack
Now we support cli
, micro
, fpm
and embed
SAPI. 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:
./bin/spc build "openssl,pcntl,mbstring" --debug --build-all
./bin/spc download --all --debug
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.
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)
phpmicro is a SelF-extracted eXecutable SAPI module, provided by phpmicro project. But this project is using a fork of phpmicro, because we need to add some features to it. 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.
echo "<?php echo 'Hello world' . PHP_EOL;" > code.php
cat micro.sfx code.php > single-app && chmod +x single-app
./single-app
If you package a PHAR file, just replace code.php
with the phar file path.
You can use box-project/box to package your CLI project as Phar,
It is then combined with phpmicro to produce a standalone executable binary.
# 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
# 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
In some cases, PHAR files may not run in a micro environment. Overall, micro is not production ready.
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 common 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
.
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, 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.
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.
If you want to contribute documentation, please just edit in docs/
.
Now there is a static-php organization, which is used to store the repo related to the project.
You can sponsor me or my project from GitHub Sponsor. A portion of your donation will be used to maintain the static-php.dev server.
This project itself is based on MIT License, some newly added extensions and dependencies may originate from the the other projects, and the headers of these code files will also be given additional instructions LICENSE and AUTHOR.
These are similar projects:
The project uses some code from dixyes/lwmbs, such as windows static build target and libiconv support. lwmbs is licensed under the Mulan PSL 2.
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.