使用 FrankenPHP 代替 nginxphp-fpm 部署 php程序网站程序 本次我们使用国内框架 ThinkPHP 作为部署目标,其他框架类似。

1747303708

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 部署步骤

前期需要准备的文件

  1. thinkphp
  2. 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次性能测试

  1. nginx + php-fpm
  2. FrankenPHP
耗时FrankenPHPFrankenPHP(开启Worker)nginx + php-fpm
最大请求时间32 ms19 ms33 ms
最小请求时间22 ms5 ms21 ms
平均请求时间25 ms11 ms26 ms