hyperf/box 尝尝鲜

https://github.com/hyperf/box

管理PHP环境和相关依赖项,提供将Hyperf应用程序打包为二进制程序的能力,并提供用于管理和部署Hyperf应用程序的反向代理服务。

相关资料

box get pkg@version

这个命令就是获取dixyes/lwmbs构建出来的包,目前支持php8.0、8.1microcomposer

如:box get php@8.1

box build-prepare

在build之前做一个预检查,检测项目是否全部下载:

  • composer
  • php
  • micro

都是去github上面进行下载,php与micro下载github

build

打包swow-skeleton脚手架

  • 脚手架需要有 hyperf/phar
  • 先执行了 php bin/hyperf.php phar:build 生成一个phar文件
  • 再使用micro进行打包

示例:在进行build-self时,执行的命令如下

1
2
3
cd ./src && /Users/lihq1403/.box/php8.1 -d phar.readonly=Off bin/hyperf.php phar:build --name=box-build.phar.tmp &&
cat /Users/lihq1403/.box/micro_php8.1.sfx ./box-build.phar.tmp > /Users/lihq1403/.box/box &&
rm -rf ./box-build.phar.tmp

新的部署方式

有了这种模式,是不是就可以将二进制文件放到一个很小的镜像去运行

先构建一个box基础镜像吧

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM alpine:3.15
LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT"

ARG timezone
ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
APP_ENV=prod

# 下载box
RUN wget https://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_x86_64_linux -O box \
&& mv ./box /usr/local/bin/box \
&& chmod 755 /usr/local/bin/box
# 初始化
RUN box config set github.access-token ************** \
&& box build-prepare
1
docker build -t lihq1403/hyperf-box:8.1-alpine-v3.15-swow-0.0.3 .

构建完了之后,发现镜像大小为88.2MB

1
2
3
4
5
6
~/.box # ls -lh
total 47M
-rwxr-xr-x 1 root root 2.6M Jul 11 02:14 composer.phar
drwxrwxrwx 2 root root 4.0K Jul 11 02:15 licenses
-rwxr-xr-x 1 root root 21.9M Jul 11 02:15 micro_php8.1.sfx
-rwxr-xr-x 1 root root 22.0M Jul 11 02:15 php8.1
1
2
3
/usr/local/bin # ls -lh
total 33M
-rwxr-xr-x 1 root root 32.5M Jul 11 02:11 box

我构建了一个放到dockerhub

https://hub.docker.com/r/lihq1403/hyperf-box/tags
docker pull lihq1403/hyperf-box:8.1-alpine-v3.15-swow-0.0.3

接下来就是构建一个swow-skeleton脚手架的项目了

初始化一个项目后,修改Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 构建阶段
FROM lihq1403/hyperf-box:8.1-alpine-v3.15-swow-0.0.3 as box-build

ARG timezone
ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
APP_ENV=prod \
SCAN_CACHEABLE=(true)

WORKDIR /opt/www

COPY . /opt/www
RUN box composer install --no-dev -o \
&& box php bin/hyperf.php \
&& box build --output=/opt --name=hyperf \
&& /opt/hyperf

# 运行阶段
FROM alpine:3.15

COPY --from=box-build ["/opt/hyperf","/opt/hyperf"]

EXPOSE 9501
ENTRYPOINT ["/opt/hyperf", "start"]

这里采用了docker多阶段构建,生成二进制后,copy到一个基础镜像就可以运行了,缩小最后的镜像体积

1
docker build -t box-test .

构建完,镜像大小为 43.15 MB

1
2
3
/opt # ls -lh
total 36M
-rwxr-xr-x 1 root root 36.1M Jul 14 01:59 hyperf

运行起来没问题

1
2
$ docker run box-test
[INFO] HTTP Coroutine Server listening at 0.0.0.0:9764

知识扩展

  • 目前hyperf/box还在尝鲜阶段,hyperf3.0也还没正式发布
  • 有了这个可自执行文件,是不是以后也可以用php写命令行工具了
  • 配合以后完善的hyperf/nano,可以仅使用协程功能打造命令行工具

构建一个命令行工具应该用下面这些就可以了吧