PHP 项目
PHP 项目用于部署需要常驻进程的 PHP 应用,例如 Laravel Octane、Swoole、Workerman 等。
提示
传统的 PHP-FPM 应用(如 WordPress、Laravel)应使用 PHP 网站 方式部署,而非项目。
工作原理
每个项目都作为 systemd 服务(Type=simple)进行管理。 创建项目时,AcePanel 会在 /etc/systemd/system/<name>.service 生成一个 unit 文件,因此启动、停止、重启、开机自启、失败自动重启和日志收集均由 systemd 处理。
由于 systemd 直接运行启动命令(而非通过 shell),该命令不支持 cd、&&、管道或内联环境变量前缀等 shell 特性。 启动命令中的相对路径(例如 server.php)相对于工作目录解析,该目录默认为项目目录。 创建后可通过编辑项目来设置环境变量和工作目录。
适用场景
- Laravel Octane(Swoole/RoadRunner)
- ThinkPHP
- Webman
- Hyperf
- Swoole 应用
- Workerman 应用
- 其他需要常驻进程的 PHP 应用
创建 PHP 项目时,创建对话框提供了框架预设(Laravel Octane、Laravel Artisan Serve、ThinkPHP、Webman、Hyperf、Swoole HTTP、RoadRunner)。 选择 PHP 版本和预设即可自动填充启动命令,或选择自定义来编写自己的命令。
前置要求
- PHP 运行环境:在 应用 > 运行环境 中安装所需的 PHP 版本
- 按需安装 Swoole 或其他扩展
部署 Laravel Octane
创建项目
- 创建项目:
- 项目名:
myapp - 项目目录:
/opt/ace/projects/myapp(若留空,则默认为项目路径设置加上项目名) - 运行用户:服务运行所使用的用户(默认为
www) - 启动命令:
php84 artisan octane:start --host=0.0.0.0 --port=8000
- 项目名:
- 启用反向代理可为此项目自动创建一个反向代理网站
启动命令示例
# Laravel Octane (Swoole)
php84 artisan octane:start --host=0.0.0.0 --port=8000
# Laravel Octane (RoadRunner)
php84 artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8000
# Swoole HTTP Server
php84 server.php
# Workerman
php84 start.php start
# RoadRunner
php84 vendor/bin/rr serve
# Laravel Queue Worker
php84 artisan queue:workSwoole 应用示例
<?php
$server = new Swoole\HTTP\Server("0.0.0.0", 9501);
$server->on("request", function ($request, $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello World");
});
$server->start();启动命令:php84 server.php
Workerman 应用示例
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker("http://0.0.0.0:8080");
$worker->onMessage = function($connection, $request) {
$connection->send("Hello World");
};
Worker::runAll();启动命令:php84 start.php start
队列处理
Laravel 队列 Worker 也可以作为项目运行:
php84 artisan queue:work --tries=3管理项目
每个项目都列在项目页面上,显示其状态(运行中 / 已停止 / 失败 / 未激活)、类型、自启状态和目录。 每行提供以下操作:
- 启动 / 停止:启动已停止的项目或停止运行中的项目。
- 重启:重启服务。 仅在项目运行时显示。 更新代码后使用此操作以使更改生效。
- 重载:向服务发送重载信号。 仅在项目运行时显示;若配置了重载命令则使用该命令。
- 日志:打开服务的实时日志查看器。
- 编辑:打开下文所述的编辑器。
- 删除:移除该项目。 删除前需要进行带 5 秒倒计时的确认。
- 开机自启:表格中的开关用于切换服务是否随开机启动。
你也可以选中多个项目,使用表格上方的删除按钮批量移除它们(同样有 5 秒倒计时保护)。 点击目录标签会在文件管理器中打开项目目录。
编辑项目设置
打开编辑会显示五个选项卡,它们直接对应生成的 systemd unit 文件。 保存后,unit 文件会被重写。
基本设置
- 项目名:服务标识符。
- 描述:显示在项目列表中的自由文本备注,并写入 unit 的
Description。 - 项目目录:项目根目录。
- 工作目录:服务的
WorkingDirectory。 可选;默认为项目目录。 命令中的相对路径相对于此目录解析。 - 运行用户:服务运行所使用的用户(
www、root、nobody或自定义值)。
运行设置
- 启动命令:
ExecStart命令(不支持 shell 特性,详见工作原理)。 - 启动前命令 / 启动后命令:可选的
ExecStartPre/ExecStartPost命令,在主进程启动前/后运行。 - 停止命令 / 重载命令:可选的自定义
ExecStop/ExecReload命令。 - 重启策略:
Restart=策略。 可选项:不重启、总是重启、失败时重启(默认)、异常时重启、中止时重启、成功时重启。 - 重启间隔:
RestartSec,例如5s或1min。 - 最大重启次数:对应
StartLimitBurst,即在限流窗口内允许的最大重启次数。 - 启动超时(秒) / 停止超时(秒):
TimeoutStartSec/TimeoutStopSec。 - 标准输出 / 标准错误:
StandardOutput/StandardError目标。 可选项包括journal、syslog、kmsg、null,或采用追加/截断模式的文件(例如append:/var/log/...)。 - 环境变量:以
Environment条目形式写入的键值对。
依赖
控制启动顺序和服务依赖。 常见值:network.target、mysqld.service、postgresql.service、redis.service。
- Requires:强依赖;若这些依赖不可用,服务将无法启动。
- Wants:弱依赖;即使这些依赖失败,服务仍会启动。
- After:在所列服务之后启动本服务。
- Before:在所列服务之前启动本服务。
资源限制
- 内存限制(MB):服务的
MemoryLimit。 设为0表示无限制。 适用于限制内存逐渐增长的常驻 PHP 进程。 - CPU 配额:
CPUQuota,例如50%或200%(100% = 1 个 CPU 核心)。
安全设置
这些选项可加强服务隔离。 启用前请充分测试,因为它们可能会破坏功能。
- 禁止新权限:设置
NoNewPrivileges=true。 - 保护 /tmp:为服务提供独立的
/tmp。 - 保护 /home:设置
ProtectHome=true。 - 保护系统:
ProtectSystem模式 ——true(/usr、/boot只读)、full(同时/etc只读)或strict(整个文件系统只读)。 - 读写路径 / 只读路径:
ReadWritePaths/ReadOnlyPaths列表,通常与保护系统配合使用,以授予或限制对特定目录的访问。
注意
- 常驻进程的 PHP 应用需要注意内存泄漏问题
- 代码更新后需要重启项目才能生效
- 服务默认使用
Restart=on-failure,因此若进程异常退出,systemd会自动重启它
