FrankenPHP实践

目录

[1. 说明](#1. 说明)

[2. 程序修改](#2. 程序修改)

[3. 性能测试](#3. 性能测试)

[4. 配置](#4. 配置)

[4.1 Docker化部署](#4.1 Docker化部署)

[4.2 泛域名和证书设置](#4.2 泛域名和证书设置)

[4.3 相关命令](#4.3 相关命令)

[5. 要点:](#5. 要点:)

[6. 参考](#6. 参考)


1. 说明

Frankenphp是一个先进的,结合了高性能Caddy服务器的PHP环境框架 ,它允许用户只需要少量改动,就能让传统的php前端应用插上翅膀,享受到异步服务 带来的量级提升体验,官网:https://frankenphp.dev。

它实际上是有两种运行模式:普通模式和worker模式,其中的普通模式类似于传统的LNMP容器,只是Nginx换成了Caddy Server,带来的提升并不特别明显。而worker模式就不同了,效果是原来性能的三倍左右。

2. 程序修改

以TP6为例,用worker模式的话,入口程序需改由frankenphp_handle_request包裹使用,参考官网docs: FrankenPHP: the modern PHP app server

复制代码
<?php
ignore_user_abort(true);

require __DIR__ . '/../vendor/autoload.php';

$thinkApp = new \think\App();
$http = $thinkApp->http;
$handler = static function () use ($http) {
    // 初始化并处理请求
    $response = $http->run();
    // 发送响应
    $response->send();
    // 返回响应后终止应用
    $http->end($response);
};
$maxRequests = (int)($_SERVER['MAX_REQUESTS'] ?? 0);
for ($nbRequests = 0; !$maxRequests || $nbRequests < $maxRequests; ++$nbRequests) {
    // 处理请求
    $keepRunning = \frankenphp_handle_request($handler);
    // 执行一些在发送 HTTP 响应后的操作
    gc_collect_cycles(); // 垃圾回收
    if (!$keepRunning) break;
}

3. 性能测试

Performance benchmark of PHP runtimes - DEV Community

4. 配置

4.1 Docker化部署

docker-compose.yml,其中: 证书路径映射到 /data0/Server/Auths/certs

复制代码
# compose.yaml

services:
  php:
    container_name: frankenphp
    # image: dunglas/frankenphp
    build:
      dockerfile: frankenphp.Dockerfile
      context: ./docker
    restart: always
    # restart: unless-stopped
    # uncomment the following line if you want to use a custom Dockerfile
    #build: .
    environment:
      SERVER_NAME: api-test001.xxx.com, api-test001a.xxx.com, php:80
      MAX_REQUESTS: 600
      FRANKENPHP_CONFIG: |
        worker {
          file  /app/public/index.php
          num 42
          watch
        }
      #CADDY_SERVER_EXTRA_DIRECTIVES: try_files {path} {path}/ /index.php?s=/{path}&{query}
      CADDY_SERVER_EXTRA_DIRECTIVES: |
        try_files {path} {path}/ /index.php?s=/{path}&{query}
    ports:
      - "80:80" # HTTP
      - "443:443" # HTTPS
      - "443:443/udp" # HTTP/3
    volumes:
      # - /data0/Projects/Test/test001:/app/public
      #- /home/website/ad_serving_backend:/app  # App src
      - /home/website/tp:/app  # App src
      - /data0/Server/Settings/caddy/Caddyfile:/etc/caddy/Caddyfile
      - /data0/Server/Db/caddy:/data
      - /data0/Server/Settings/caddy/config:/config
      - /data0/Server/Auths/certs:/certs
    # comment the following line in production, it allows to have nice human-readable logs in dev
    tty: true
4.2 泛域名和证书设置

尽管Caddy自带无敌好感的自注册安全证书机制,但有时候我们还是需要手动部署一些已有的证书(nginx原有证书即可),这时我们要编辑Caddyfile做定制:

复制代码
*.xxx.com {
        #log {
        #       # Redact the authorization query parameter that can be set by Mercure
        #       format filter {
        #               request>uri query {
        #                       replace authorization REDACTED
        #               }
        #       }
        #}

        root * public/
        encode zstd br gzip
        
        tls /certs/xxx.com/xxx.com.pem /certs/xxx.com/xxx.com.key

        {$CADDY_SERVER_EXTRA_DIRECTIVES}

        php_server
}
4.3 相关命令
复制代码
docker compose down && docker compose up -d --wait

# 修改配置后重拉容器
docker compose down && docker compose -f /data0/Server/Settings/docker-compose/frankenphp/docker-compose.yml up -d --wait

# restart
docker compose -f /data0/Server/Settings/docker-compose/frankenphp/docker-compose.yml restart

# 日志
docker logs frankenphp

5. 要点:

如果自建镜像扩展插件,需三思是否需要加Opcache,开启后 frankenphp 的watch功能(监控文件修改自动热启)将不能正常使用,但开启后,性能将提高40%左右。

6. 参考

相关推荐
小白跃升坊6 小时前
PHP2Shell:AI 两天挖出 9.2 分漏洞,让全球 70% 网站连夜打补丁!1Panel 已经把修复版本封装好,推到了你的应用商店里。
php·开源安全·1panel·ai安全·漏洞披露
Json____9 小时前
PHP 突发严重安全漏洞,AI 开始改变网络安全的攻防方式
人工智能·web安全·php·it学习·wwwoop.com
catchadmin9 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
Web极客码10 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
xuefeiniao11 小时前
PHP2Shell漏洞修复
运维·服务器·php
ServBay11 小时前
AI说代码没漏洞?马上被 PHP 打脸了
aigc·php·ai编程
tq108613 小时前
对PHP漏洞的思考
php
wangruofeng13 小时前
黑色十月:AI 找到的漏洞,两小时数十万次利用
人工智能·安全·php
陌陌龙16 小时前
【紧急预警!PHP 核弹级漏洞 php2shell】
开发语言·php
企业解惑小能手-域智盾系统16 小时前
内网监控软件策略不生效、日志缺失?一套从现象到根因的排查框架
开发语言·php·域智盾