news 2026/2/13 3:48:29

FrankenPHP实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FrankenPHP实践

目录

1. 说明

2. 程序修改

3. 性能测试

4. 配置

4.1 Docker化部署

4.2 Caddy泛域名和证书设置

4.3 相关命令

5. 要点:

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 2:15:39

DeepSeek API 调用 - Spring Boot 实现

DeepSeek API 调用 - Spring Boot 实现 1. 项目依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></depe…

作者头像 李华
网站建设 2026/2/12 21:13:44

AI Agent架构解析:从感知-决策-执行闭环看新一代应用范式

以前我们做企业软件&#xff0c;最常见的交付物是“功能”&#xff1a;一个页面、一个按钮、一个报表、一个流程。用户买的是工具&#xff0c;工具怎么用、用得好不好&#xff0c;很大程度取决于人。 但这两年&#xff0c;很多团队开始意识到&#xff1a;真正值钱的不是工具本身…

作者头像 李华
网站建设 2026/2/12 16:54:52

基于SpringBoot的乡村支教管理系统(毕设源码+文档)

背景 本课题聚焦基于SpringBoot框架的乡村支教管理系统设计与实现&#xff0c;旨在解决传统乡村支教工作中志愿者招募与管理低效、支教资源调配不均、教学活动记录零散、支教效果评估不规范及各方沟通协同不足等问题。系统采用B/S架构&#xff0c;依托浏览器即可实现多端便捷访…

作者头像 李华
网站建设 2026/2/12 21:20:21

DVWA靶场通关——SQL Injection篇

一&#xff0c;Low难度下unionget字符串select****注入 1&#xff0c;首先手工注入判断是否存在SQL注入漏洞&#xff0c;输入1这是正常回显的结果&#xff0c;再键入1’ You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versio…

作者头像 李华
网站建设 2026/2/11 10:55:06

docker desktop安装redis

1.拉取redis镜像 docker hub直达 docker pull redis:latest查看镜像 PS C:WindowsSystem32> docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest 0e403e3816e8 3 days ago 113MB mysql …

作者头像 李华