如何将PHP的Webman框架打包成二进制文件运行

PHP技术
375
0
0
2024-03-12

webman支持将项目打包成一个二进制文件,这使得webman无需php环境也能在linux系统运行起来。

注意
  • 打包后的文件目前只支持运行在x86_64架构的linux系统上,不支持mac系统
  • 需要关闭php.iniphar配置选项,既设置 phar.readonly = 0

安装webman

composer create-project workerman/webman webman2024

安装命令行

cd webman2024

composer require webman/console

配置

打开 webman2024/config/plugin/webman/console/app.php 文件,修改以下配置

'exclude_pattern'   => '#^(?!.*(composer.json|/.github/|/.idea/|/.git/|/.setting/|/runtime/|/vendor-bin/|vendor/webman/admin))(.*)$#',
该配置项主要用于打包时排除一些无用的目录及文件,避免打包体积过大。

打包

运行命令

/usr/local/php-8.2.14/bin/php webman build:bin

如果提示以下信息表示没有关闭php.iniphar配置选项

重新打包
webman2024$ /usr/local/php-8.2.14/bin/php webman build:bin 8.2
Phar packing...
Files collect complete, begin add file to Phar.
Write requests to the Phar archive, save changes to disk.

Use PHP8.2 ...

Saved webman.bin to /home/www/build/webman2024/build/webman.bin
Build Success!

打包后会在bulid目录生成一个webman.bin文件

.
├── build
│   ├── php8.2.micro.sfx
│   ├── php8.2.micro.sfx.zip
│   ├── webman.bin
│   └── webman.phar

启动

webman.bin上传至Linux服务器,执行 ./webman.bin start./webman.bin start -d 即可启动。

$ ./webman.bin start
Workerman[./webman.bin] start in DEBUG mode
------------------------------------------- WORKERMAN -------------------------------------------
Workerman version:4.1.14          PHP version:8.2.8           Event-Loop:\Workerman\Events\Event
-------------------------------------------- WORKERS --------------------------------------------
proto   user            worker          listen                 processes    status           
tcp     www             webman          http://0.0.0.0:8787    8             [OK]            
tcp     www             monitor         none                   1             [OK]            
-------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

查看运行状态

$ ./webman.bin status
Workerman[./webman.bin] status 
----------------------------------------------GLOBAL STATUS----------------------------------------------------
Workerman version:4.1.14          PHP version:8.2.8
start time:2024-01-03 09:06:20   run 0 days 0 hours   
load average: 0.16, 0.11, 0.09   event-loop:\Workerman\Events\Event
2 workers       9 processes
worker_name  exit_status      exit_count
webman       0                0
monitor      0                0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory  listening           worker_name  connections send_fail timers  total_request qps    status
13279 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13280 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13281 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13283 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13285 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13286 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13287 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13289 99.06M  http://0.0.0.0:8787 webman       0           0         0       0             0      [idle]
13291 98.68M  none                monitor      0           0         1       0             0      [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 890M    -                   -            0           0         1       0             0      [Summary] 

打包原理

  • 将本地webman项目打包成一个phar文件
  • 然后远程下载php8.x.micro.sfx到本地
  • php8.x.micro.sfxphar文件拼接为一个二进制文件

注意事项

  • 本地php版本php>=7.2都可以执行打包命令
  • 但是只能打包成php8的二进制文件
  • 强烈建议本地php版本和打包版本一致,也就是如果本地是php8.0,打包也用php8.0,避免出现兼容问题
  • 打包会下载php8的源码,但是并不会本地安装,不会影响本地php环境
  • webman.bin目前只支持在x86_64架构的linux系统运行,不支持在mac系统运行
  • 默认不打包env文件(config/plugin/webman/console/app.phpexclude_files控制),所以启动时env文件应该放置与webman.bin相同目录下
  • 运行过程中会在webman.bin所在目录生成runtime目录,用于存放日志文件
  • 目前webman.bin不会读取外部php.ini文件,如需要自定义php.ini,请在 /config/plugin/webman/console/app.php 文件custom_ini中设置

PHP如何打包二进制文件

1、新建文件 tinywan.php,内容如下

<?php

echo 'Hello, this is Tinywan awesome app ' . PHP_EOL;

2、将micro.sfxphp文件拼接为一个二进制文件

cat php8.2.micro.sfx tinywan.php > tinywan

3、赋予二进制文件执行权限

chmod 0755 tinywan

4、执行二进制文件

$ ./tinywan 
Hello, this is Tinywan awesome app 

static-php-cli

static-php-cli: 在Linux、macOS、FreeBSD、Windows(Linux)上构建独立的PHP二进制文件,与PHP项目一起,包括流行的扩展。

了解更多:https://github.com/crazywhalecc/static-php-cli/blob/main/README-zh.md