部署 PHP 项目

Zeabur 除了支持传统的多文件 PHP、以 index.php 为入口的项目,还支持 Laravel、Symfony、ThinkPHP、CodeIgniter 等框架的一键部署。

PHP 环境

Zeabur 默认使用 PHP 8 的最新版本、NGINX + php-fpm 服务器来运行您的代码。

Zeabur 的 PHP 环境内置 Composer、apcu、bcmath、gd、intl、mysqli、opcache、pcntl、pdo_mysql、sysvsem、zip 等 PHP 扩展。如果您的 composer.json 中安装了其他以 ext- 开头的扩展类型定义,Zeabur 也会自动安装对应的扩展。此外,还会默认安装 Node.js、Crontab、cURL、gettext、Git、grep、pkg-config、unzip 等工具。

Zeabur 默认会带入 APP_ENV=prod 和 APP_DEBUG=true 环境变量到您的应用程序中,您可以在 Zeabur 控制台的“环境变量”区域手动覆盖这些变量。

完整的基础镜像配置可以参考 zbpack 的代码仓库。

NPM 支持

如果您的项目有 package.json,Zeabur 会帮您运行 npm install 安装依赖。

如果您的项目的 package.json 有 build 脚本,Zeabur 会自动帮您运行 npm run build 编译产物。

自定义编译和启动命令

Zeabur 允许您使用环境变量或配置文件自定义 PHP 的编译和启动命令。

“编译命令”适用于需要下载或编译自定义产物(如 CSS、JavaScript 等等)或配置文件的场景。例如,您希望往 /etc 文件夹写入配置文件,可以设置环境变量:

ZBPACK_BUILD_COMMAND=echo 'your-configuration' > /etc/somewhere

或者在 zbpack.json 中加入以下配置:

zbpack.json
{
    "build_command": "echo 'your-configuration' > /etc/somewhere"
}

您也可以在这里执行其他 npm 的命令:

zbpack.json
{
    "build_command": "npm run build:dist"
}

编译命令 不会 影响 Zeabur 原本的编译流程,所以您不需要手动在这里重复指定 Zeabur 默认帮您执行的命令。

“启动命令”适用于启动 PHP 服务器时的场景,比如在原有命令基础上加上 php artisan migrate 来创建数据库表。例如,您可以设置环境变量:

ZBPACK_START_COMMAND="php artisan migrate && _startup"

或者在 zbpack.json 中加入以下配置:

zbpack.json
{
    "start_command": "php artisan migrate && _startup"
}

注意:如果是需要持续运行的服务,需要把启动命令放在 () 中,并用 & 把任务放到后台运行:

ZBPACK_START_COMMAND="(php artisan reverb:start &); _startup"

或者

zbpack.json
{
    "start_command": "(php artisan reverb:start &); _startup"
}

其中 _startup 是 Zeabur 原本的启动命令(可以在 zbpack 查阅)。如果您有自定义 start_command,_startup 必须在您的启动命令中执行,否则不会启动 PHP 服务器。

build_command 和 start_command 均会使用 POSIX 兼容的 shell 执行,因此您可以使用 && 连接多个命令,或者使用 ; 分隔多个命令。

复杂启动命令的处理方式

如果你的启动命令很复杂(比如涉及到定时任务的设置、多个服务的启动等),start_command 可能会变得太复杂且不容易调试。可以尝试将这些命令用 Config Editor 打包在一个脚本中,比如 worker.sh:

worker.sh
#!/usr/bin/env bash
 
php artisan migrate
php artisan queue:work &
# 以及你的各种命令

然后在 start_command 中执行这个脚本:

zbpack.json
{
    "start_command": "(bash worker.sh &); _startup"
}
 
```env
ZBPACK_START_COMMAND=(bash worker.sh &); _startup

Workers 的处理方式

对于队列处理或定时任务,我们建议你分开服务处理。

假如你想要启动一个队列 worker,你可以在主服务之外,另外部署一个服务 queue-worker,其中 start_command 是:

ZBPACK_START_COMMAND="php artisan queue:work"

记得不要加入 ; _startup 以免启动 PHP 服务器。这样你就会有单独的一个用来处理异步任务的服务了。

如果你还需要多一个处理定时任务的服务,你可以再部署一个服务 cron-worker,其中 start_command 是:

ZBPACK_START_COMMAND="php artisan schedule:work"

这样一来,就算你其中一个 worker 出现问题,其他 workers 以及主服务也不会受到影响。

自定义 PHP 版本

Zeabur 默认使用 PHP 8,但您可以使用 composer.json 或 zbpack 的配置来指定 PHP 版本。如果您的项目是 Laravel Sail,Zeabur 也会根据 docker-compose.yml 自动判断。zbpack 配置优先级最高,composer.json 次之,Laravel Sail 最低。

composer.json

在 composer.json 的 require 中设置 php 版本范围:

composer.json
{
    "require": {
        "php": "7.4"
    }
}

以上例子中,Zeabur 会使用 PHP 7.4 的最新补丁版本运行您的项目。

composer.json
{
    "require": {
        "php": "^7.4"
    }
}

以上例子中,Zeabur 会使用 PHP 7 的最新次版本运行您的项目。

Laravel Sail

如果您的项目是 Laravel Sail,Zeabur 会自动检测并使用 Laravel Sail 在 docker-compose.yml 中定义的 PHP 版本。

Laravel Sail 的 Docker Compose 定义

zbpack 配置

如果您没有使用 Laravel Sail 或 Composer,但需要更改 PHP 版本,可以使用 ZBPACK_PHP_VERSION 环境变量:

ZBPACK_PHP_VERSION=8.0

或者在 zbpack.json 中加入以下配置:

zbpack.json
{
    "php": {
        "version": "8.0"
    }
}

来自定义 PHP 版本。

自定义 php.ini 配置

使用 Zeabur 的配置文件编辑器,创建一个路径在 /usr/local/etc/php/conf.d、后缀名为 ini 的配置文件,直接写上您想覆盖的 PHP 配置即可。

例如,如果想将最大上传文件大小设置为 100MB,可以创建一个文件 /usr/local/etc/php/conf.d/upload.ini,内容如下:

/usr/local/etc/php/conf.d/upload.ini
upload_max_filesize = 100M

自定义 NGINX 配置

使用 Zeabur 的配置文件编辑器,创建一个路径为 /etc/nginx/sites-enabled/default 的配置文件,覆盖 Zeabur 默认的 NGINX 配置。创建后会自动带入当前的 NGINX 配置,您可以在此基础上进行修改。

例如,假如您想要禁用 gzip 压缩,可以将模板中的 gzip_static on; 改为 gzip_static off;。

/etc/nginx/sites-enabled/default
location / {
    try_files $uri $uri/ /index.php$is_args$args;
    gzip_static off;
}