update README

This commit is contained in:
crazywhalecc
2023-03-18 14:19:45 +08:00
parent 3488bce63d
commit 21c582d309
2 changed files with 185 additions and 346 deletions

View File

@@ -1,180 +1,121 @@
# static-php-cli
Compile A Statically Linked PHP With Swoole and other Extensions.
Compile A Statically Linked PHP With Swoole and other Popular Extensions.
Compile a purely static PHP binary file with various extensions to make PHP-cli applications more portable!
Compile A Single Binary With PHP Code.
You can also use the micro binary file to package PHP source code and binary files into one for distribution!
**If you are intrested in this project, don't miss this discussion: <https://github.com/crazywhalecc/static-php-cli/discussions/29>**
[![version](https://img.shields.io/badge/version-1.5.2-green.svg)]()
![Build Actions](https://github.com/crazywhalecc/static-php-cli/actions/workflows/build-php.yml/badge.svg)
Note: only support cli SAPI, not support fpm, cgi.
## Compilation Requirements
- Supporting architecture: `x86_64`, `arm64(aarch64)`, `armv7(armv7l)`
- Docker required (or alpine linux 3.13+)
- PHP version from 7.2 to 8.1
- Micro Package requires PHP >= 8.0
Yes, this project is written in PHP, pretty funny.
But php-static-cli only requires an environment above PHP 8.0.
## Runtime Requirements
- Linux
- Supported arch: aarch64, amd64
- Supported distributions: alpine, ubuntu, centos
- Requirements: (TODO)
- macOS
- Supported arch: arm64, x86_64
- Requirements: make, bison, flex, pkg-config, git, autoconf, automake, tar, unzip, xz, gzip, bzip2, cmake
- Windows
- Supported arch: x86_64
- Requirements: (TODO)
- PHP
- Supported version: 8.0, 8.1, 8.2
Linux
## Usage (WIP)
## Usage
After stable release for this project, a single phar and single binary for this tool will be published.
1. Directly download static binary from this link or [Actions uploaded artifacts](https://github.com/crazywhalecc/static-php-cli/actions).
<https://dl.zhamao.xin/php-bin/file/>
2. Use fast install script `install-runtime.sh` to download static php and composer distribution into `runtime/` directory
But this script has some Chinese comments and prompts, if you cannot understand or have to use it in English, I will make an pure international version! :)
And currently you may need to clone this branch and edit GitHub Action to build.
```bash
bash -c "`curl -fsSL https://raw.githubusercontent.com/crazywhalecc/static-php-cli/master/install-runtime.sh`"
chmod +x static-php-cli
# 拉取所有依赖库
./static-php-cli fetch --all
# 构建包含 bcmath 扩展的 php-cli 和 micro.sfx
./static-php-cli build "bcmath" "" --build-all
```
## Packing PHP Code into a Static Binary
## Current Status
From v1.5.0, we support packing PHP code into a static binary. You can pack your PHP code into a static binary by micro.
- [X] Basic CLI framework (by symfony/console)
- [ ] Linux support
- [ ] macOS support
- [X] Exception handler
- [ ] Windows support
- [ ] PHP 7.4 support
You can directly download `micro-` prefix file, untar it and you will get file `micro.sfx`.
## Supported Extensions
Here's a simple example to use it:
> - yes: supported and tested
> - untested: supported but not tested
> - empty: not supported yet
```bash
echo "<?php echo 'Hello world' . PHP_EOL;" > code.php
cat micro.sfx code.php > single-app && chmod +x single-app
./single-app
| | Linux | macOS | Windows |
|------------|-------|----------|---------|
| bcmath | | yes | |
| calendar | | | |`
| ctype | | | |
| curl | | | |
| date | | yes | |
| dom | | | |
| event | | | |
| exif | | | |
| filter | | | |
| fileinfo | | | |
| ftp | | | |
| gd | | untested | |
| hash | | yes | |
| iconv | | | |
| inotify | | | |
| json | | yes | |
| libxml | | | |
| mbstring | | | |
| mongodb | | | |
| mysqli | | | |
| mysqlnd | | | |
| openssl | | yes | |
| pcntl | | untested | |
| pcre | | yes | |
| pdo | | yes | |
| pdo_mysql | | | |
| pdo_sqlite | | yes | |
| pdo_pgsql | | | |
| phar | | | |
| posix | | | |
| protobuf | | | |
| readline | | | |
| redis | | | |
| Reflection | | yes | |
| shmop | | | |
| simplexml | | | |
| soap | | | |
| sockets | | | |
| sqlite3 | | untested | |
| swow | | | |
| swoole | | yes | |
| tokenizer | | | |
| xml | | | |
| xmlreader | | | |
| xmlwriter | | | |
| zip | | | |
| zlib | | | |
# If packing phar into a static binary, just change code.php to your phar path.
```
> Note: It means that your PHP code won't be compiled and you can't protect your source code by using micro!
>
> If you are looking for compiling PHP code or encrypting code, here's not your solution.
>
> Special thanks: <https://github.com/dixyes/phpmicro>
## Open-Source LICENSE
## Compiling
This project is based on the tradition of using the MIT License for old versions,
while the new version references source code from some other projects.
Special thanks to:
Here's help command to compile it yourself:
- dixyes/lwmbs (Mulun Permissive License)
- 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.
```bash
git clone https://github.com/crazywhalecc/static-php-cli.git
cd static-php-cli/docker
docker build -t static-php . --build-arg USE_BACKUP_ADDRESS=yes
# Making a directory to put binary files
mkdir dist
# It will ask you for PHP version, extensions, and compile static binaries
docker run --rm -v $(pwd)/dist:/dist/ -it static-php build-php
```
After compilation you can use command to get static php binary file.
```bash
cd dist
file ./php
```
If you don't want to use docker, a single script for compiling in **Alpine Linux**:
```bash
cd docker
# Change PHP Version
export VER_PHP="8.1.7"
# Use Original download link (Default is China mainland mirror link, for others please use 'yes' for original link)
export USE_BACKUP="yes"
./fast-compiler.sh
```
To customize PHP extensions, edit `docker/extensions.txt` file, and rules below:
- Use `^` as deselect, to mark not install. Use `#` as comments.
- extensions name uses lower case, and default file contains all supported extensions, if u need other extensions, consider write an Issue
## Supported PHP extensions
| Support | PHP Ext Name | Version | Comments |
| ------- | ------------ | ------- | ---------------------------------------- |
| yes | bcmath | * | |
| yes | calendar | * | |
| yes | ctype | * | |
| yes | curl | * | |
| yes | dom | * | |
| yes | event | >=3.0.8 | author's bitbucket version, not pecl |
| yes | exif | * | |
| yes | filter | * | |
| yes | fileinfo | * | |
| yes | gd | * | |
| yes | hash | * | |
| yes | iconv | * | |
| yes | inotify | 3.0.0 | |
| yes | json | * | |
| yes | libxml | * | |
| yes | mbstring | * | |
| yes | mongodb | >=1.9.1 | not tested |
| | mysqli | | |
| yes | mysqlnd | * | |
| yes | openssl | * | |
| yes | pcntl | * | |
| yes | pdo | * | |
| yes | pdo_mysql | * | |
| yes | pdo_sqlite | * | |
| | pdo_pgsql | * | |
| yes | phar | * | |
| yes | posix | * | |
| yes, not compiled | protobuf | * | Not compiled and enabled as default |
| yes | readline | * | Not support `./php -a` |
| yes | redis | * | |
| yes | shmop | * | |
| yes | simplexml | * | |
| yes | soap | * | |
| yes | sockets | * | |
| yes | sqlite3 | * | |
| yes | swoole | >=4.6.6 | support mysqlnd, sockets, openssl, redis |
| yes | tokenizer | * | |
| yes | xml | * | |
| yes | xmlreader | * | |
| yes | xmlwriter | * | |
| yes | zip | * | not support `bzip2`, `lzma` compression |
| yes | zlib | * | |
## Customization
- If you are going to run without prompt, Just add it to the end of `docker run xxx` cmd according to the parameters given below.
> 1st parameter `original` represents that you are using global original download address to fetch dependencies, if you are in mainland China, use `mirror`.
>
> 2nd parameter `8.1.7` is your PHP version you are compiling.
>
> 3rd parameter `all` represents that you will compile all supported extensions.
>
> 4th parameter `/dist/` is your binary output directory.
>
> For example, `docker run --rm -v $(pwd)/dist:/dist/ -it static-php build-php original 8.1.7 all /dist/`
- `docker/extensions.txt` edit extensions.
- `docker/compile-php.sh` file `php_compile_args` function to adjust PHP configure arguments.
- `docker/check-extensions.sh` file `check_in_configure` function to adjust extensions' configure arguments.
- `docker/config.json` edit extensions and dependencies version and download links.
## Current Issue
- [X] Not support event(libevent), because of its `config.m4` and code.
- [ ] Swoole not support `--enable-swoole-curl`.
- [X] Not support readline, maybe caused by ncurses library.
- [X] Not support curl (solved)
- [X] Customize extensions to compile
- [X] php.ini integration
- [X] i18n (including README and scripts)
## Running preview
### Using static binary
<img width="881" alt="未命名" src="https://user-images.githubusercontent.com/20330940/168441751-e62cb8d4-a3c8-42d9-b34e-d804b39756a1.png">
### Using swoole application packed with micro
<img width="937" alt="all" src="https://user-images.githubusercontent.com/20330940/168557743-b8f92263-712f-490e-9fe0-831597741595.png">
## References
- <https://blog.terrywh.net/post/2019/php-static-openssl/>
- <https://stackoverflow.com/a/37245653>
- <http://blog.gaoyuan.xyz/2014/04/09/statically-compile-php/>
Please use the `dump-license` command to export the open source licenses used in the project after compilation,
and comply with the corresponding project's LICENSE.