使用 FrankenPHP 代替 nginx 和 php-fpm 部署 php程序网站程序 本次我们使用国内框架 ThinkPHP 作为部署目标,其他框架类似。
FrankenPHP
FrankenPHP 建立在 Caddy Web 服务器之上的现代 PHP 应用程序服务器,用 Go 编写。
FrankenPHP 特性
- 可伸缩
与 PHP 8.2+、大多数 PHP 扩展和所有 Caddy 模块兼容。 - 唯一服务
设计简洁明了:只需要一个服务,只需要一个二进制文件!FrankenPHP 不需要 PHP-FPM,它使用为 Go web 服务器特别定制的自己的 SAPI。 - 易于部署
作为Docker 镜像的云原生应用交付。兼容 Kubernetes 和所有现代云平台。也可以将您的 PHP 应用程序打包为独立的、自执行的静态二进制文件。 - Worker 模式
一次启动您的应用程序并保持其在内存中!它准备在几毫秒内处理传入请求。 - 103 Early Hints
103 Early Hints 是 web 平台的一个全新特性,可以通过提前 30% 的时间加载网站。FrankenPHP 是唯一支持提前提示的 PHP SAPI! - 实时功能
内置的Mercure 中心。从您的 PHP 应用程序发送事件到所有连接的浏览器,它们立即作为 JavaScript 事件接收负载! - Brotli、Zstandard 和 Gzip 压缩
多种现代压缩格式开箱即用。 - 结构化日志
为您的日志带来更加明确的格式和细节。 - Prometheus 指标和追踪
天生内置的Prometheus 支持 - HTTP/2 & HTTP/3
原生对 HTTPS、HTTP/2 和 HTTP/3 的支持。 - HTTPS 自动化
自动生成、续订和撤销 HTTPS 证书。 - 平滑重载
通过平滑重载零停机部署您的应用。
为什么使用 ThinkPHP 作为部署目标
对比其他比较出名的框架如: Laravel , Symfony 等框架 FrankenPHP 原生就支持相关集成,反观国内用户量比较多的 ThinkPHP 没有对应相关部署文档,所以本次实验采用 ThinkPHP 框架使用 FrankenPHP 进行部署。
FrankenPHP 部署步骤
前期需要准备的文件
- thinkphp
- docker-compose.yml
初始化部署
docker-compose.yml 文件
services:
frankenphp83:
container_name: frankenphp83
image: dunglas/frankenphp:1.5.0-php8.3-alpine
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- "../tp/:/app/"
docker-compose 部署命令
命令行切换到 docker-compose.yml 文件 根目录执行。
docker compose up -d
配置FrankenPHP的ThinkPHP配置
- 进入容器
docker exec --user root -it frankenphp83 sh
- 打开 Caddy 配置
vi /etc/caddy/Caddyfile
- 修改伪静态
try_files {path} {path}/ /index.php?s=/{path}&{query}
- 开启 Worker 常驻内存提升性能(可选)
frankenphp {
worker /app/public/index.php
{$FRANKENPHP_CONFIG}
}
注意:编辑完配置后需要重启 docker
开启 Worker 调整 TP 入口文件
开启 Worker 后必须将入口文件的代码包含到 frankenphp_handle_request 方法里面。
// [ 应用入口文件 ]
require __DIR__ . '/../vendor/autoload.php';
frankenphp_handle_request(function (){
// 执行HTTP应用并响应
$http = (new App())->http;
$response = $http->run();
$response->send();
$http->end($response);
});
运行测试
以下我们使用两套本地环境分别进行100次性能测试
- nginx + php-fpm
- FrankenPHP
耗时 | FrankenPHP | FrankenPHP(开启Worker) | nginx + php-fpm |
---|---|---|---|
最大请求时间 | 32 ms | 19 ms | 33 ms |
最小请求时间 | 22 ms | 5 ms | 21 ms |
平均请求时间 | 25 ms | 11 ms | 26 ms |
评论已关闭