FrankenPHP实践

目录

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

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

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

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

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

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

[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 	hinkApp();
$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 = rankenphp_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

  • 多个应用需添加不同的worker入口描述

    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: php:80

    MAX_REQUESTS: 600

    FRANKENPHP_CONFIG: |

    worker {

    file /app1/public/index.php

    num 42

    watch

    }

    worker {

    file /app2/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/Server/Logs/caddy:/logs

    - /data0/Projects/Test/test001:/app/public

    #- /home/website/ad_serving_backend:/app # App src

    • /home/website/app1:/app1 # App1 src

    • /home/website/app2:/app2 # App2 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泛域名和证书设置

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

复制代码
{
        {$CADDY_GLOBAL_OPTIONS}

        frankenphp {
                #worker /path/to/your/worker.php
                {$FRANKENPHP_CONFIG}
        }

        # Logging
        log {
          output stderr
          level INFO
          #level DEBUG
        }
}

{$CADDY_EXTRA_CONFIG}

{$SERVER_NAME:localhost} {
        #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

        # Uncomment the following lines to enable Mercure and Vulcain modules
        #mercure {
        #       # Transport to use (default to Bolt)
        #       transport_url {$MERCURE_TRANSPORT_URL:bolt:///data/mercure.db}
        #       # Publisher JWT key
        #       publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG}
        #       # Subscriber JWT key
        #       subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG}
        #       # Allow anonymous subscribers (double-check that it's what you want)
        #       anonymous
        #       # Enable the subscription API (double-check that it's what you want)
        #       subscriptions
        #       # Extra directives
        #       {$MERCURE_EXTRA_DIRECTIVES}
        #}
        #vulcain

        {$CADDY_SERVER_EXTRA_DIRECTIVES}

        php_server
}

app1.com {
        #log {
        #       # Redact the authorization query parameter that can be set by Mercure
        #       format filter {
        #               request>uri query {
        #                       replace authorization REDACTED
        #               }
        #       }
        #}

        root * /app1/public/
        encode zstd br gzip

        tls /certs/app1.com/serv.pem /certs/app1.com/serv.key

        {$CADDY_SERVER_EXTRA_DIRECTIVES}

        log {
	      	output file /logs/app1.com.log {
	      	  rotate_size 100  # Rotate after 100 MB
              rotate_keep 5  # Keep at most 20 log files
         	  roll_keep_for 72h
	      	}
	    }

        php_server
}
app2.com {

        root * /app2/public/
        encode zstd br gzip

        tls /certs/app2.com/serv.pem /certs/app2.com/serv.key

        {$CADDY_SERVER_EXTRA_DIRECTIVES}

        log {
	      	output file /logs/app2.com.log {
	      	  rotate_size 100  # Rotate after 100 MB
              rotate_keep 5  # Keep at most 20 log files
         	  roll_keep_for 72h
	      	}
	    }

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

# 修改配置后重拉容器
docker compose -f /data0/Server/Settings/docker-compose/frankenphp/docker-compose.yml 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. 参考

-FrankenPHP: the modern PHP app server

-Performance benchmark of PHP runtimes - DEV Community

相关推荐
小灵不想卷2 小时前
LangChain4j 与 SpringBoot 整合
java·后端·langchain4j
Zachery Pole2 小时前
JAVA_07_面向对象
java·开发语言
shalou29012 小时前
mysql-connector-java 和 mysql-connector-j的区别
android·java·mysql
lipiaoshuigood2 小时前
Linux下启动redis
java
dc_00122 小时前
Java进阶——IO 流
java·开发语言·python
a1117762 小时前
Live2D 虚拟主播软件(开源Python)
java·linux·运维
me8322 小时前
【Java面试】Java核心关键字解析(static_final_访问修饰符)小白易懂
java·开发语言·面试
小飞学编程...2 小时前
【Java相关八股文(一)】
android·java·开发语言
毅炼2 小时前
Java 基础常见问题总结(5)
java·后端