当前位置: 首页 > news >正文

FrankenPHP实践

目录

1. 说明

2. 程序修改

3. 性能测试

4. 配置

4.1 Docker化部署

4.2 泛域名和证书设置

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 \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.yamlservices:php:container_name: frankenphp# image: dunglas/frankenphpbuild:dockerfile: frankenphp.Dockerfilecontext: ./dockerrestart: 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:80MAX_REQUESTS: 600FRANKENPHP_CONFIG: |worker {file  /app/public/index.phpnum 42watch}#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/3volumes:# - /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 devtty: 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 gziptls /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. 参考

- FrankenPHP: the modern PHP app server

- Performance benchmark of PHP runtimes - DEV Community

相关文章:

FrankenPHP实践

目录 1. 说明 2. 程序修改 3. 性能测试 4. 配置 4.1 Docker化部署 4.2 泛域名和证书设置 4.3 相关命令 5. 要点&#xff1a; 6. 参考 1. 说明 Frankenphp是一个先进的&#xff0c;结合了高性能Caddy服务器的PHP环境框架&#xff0c;它允许用户只需要少量改动&#xff…...

嵌入式硬件电子电路设计(一)开关电源Buck电路

目录 Buck电路基本结构 1. 开关闭合&#xff08;SW 闭合&#xff09; 2. 开关断开&#xff08;SW 断开&#xff09; 3. 开关控制和占空比 MP1584电路分析 其他Buck芯片的电路参考 Buck电路基本结构 下图是简化之后的BUCK电路主回路。下面分析输出电压的产生K闭合后&…...

java项目之协力服装厂服装生产管理系统的设计与实现(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的协力服装厂服装生产管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; …...

Java虚拟机的历程(jvm01)

Java虚拟机的历程&#xff08;jvm01&#xff09; Java虚拟机&#xff08;JVM&#xff09;作为Java语言的核心技术之一&#xff0c;自诞生以来经历了多次迭代与演变。不同的虚拟机在性能、功能以及适用场景上各有侧重。本文将介绍Java虚拟机发展历程中的一些重要虚拟机&#xf…...

[代码随想录Day4打卡] 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

24. 两两交换链表中的节点 题目&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 重点&#xff1a; 明确具体交换怎么做。交换其中1&#xff0c;2…...

java项目之校园周边美食探索及分享平台(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园周边美食探索及分享平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园周边美食…...

支持 Mermaid 语言预览,用通义灵码画流程图

想像看图片一样快速读复杂代码和架构&#xff1f;通义灵码上新功能&#xff1a;智能问答支持 Mermaid 语言的预览模式&#xff0c;即支持代码逻辑可视化&#xff0c;可以把每段代码画成流程图&#xff0c;像脑图工具一样画出代码逻辑和框架。 操作步骤&#xff1a;选中代码块&a…...

cangjie仓颉程序设计-数据结构(四)

文章目录 ArrayListLinkedListHashSetHashMapTreeMap 本专栏还在持续更新&#xff1a; Cangjie仓颉程序设计-个人总结 这是双子专栏&#xff1a; 仓颉编程cangjie刷题录 这些数据结构都在std.collection.*中。暂时官方包还没有stack, queue等数据结构。服了 import std.coll…...

Redis中储存含LocalDateTime属性对象的序列化实现

目录 1.问题1 向Redis中存入序列化对象 1.1引入 : 1.2解决方案&#xff1a; 1.2.1首先引入依赖 1.2.2然后在RedisConfig中进行配置 1.3 介绍下ObjectMapper 1.3.1 ObjectMapper 1.3.2 objectMapper.registerModule(new JavaTimeModule()); 1.3.3 GenericJackson2Js…...

蚁剑的介绍和使用

蚁剑介绍 蚁剑&#xff08;AntSword&#xff09;是一个开源的跨平台网站管理工具&#xff0c;主要用于渗透测试和安全研究。它提供了一个图形化界面&#xff0c;方便用户管理和操作被攻陷的网站。 安装教程&#xff1a; github官网&#xff1a;https://github.com/AntSwordPro…...

C++之多态的深度剖析(2)

前言 在前面内容中&#xff0c;我们对多态进行了基本的了解&#xff0c;对其中的虚函数进行着重的介绍&#xff0c;本节内容我们将进一步对多态的底层进行观察了解看看它是如何实现的。 多态如何实现 从底层的角度Func函数中ptr->BuyTicket()&#xff0c;是如何作为ptr指向P…...

一篇文章 介绍 shiro反序列化漏洞

shiro反序列化漏洞 Shiro-550反序列化漏洞&#xff08;CVE-2016-4437&#xff09; 漏洞简介 shiro-550主要是由shiro的RememberMe内容反序列化导致的命令执行漏洞&#xff0c;造成的原因是默认加密密钥是硬编码在shiro源码中&#xff0c;任何有权访问源代码的人都可以知道默认加…...

pyav保存视频

目录 imageio替代pyav imageio替代pyav import imageio import numpy as np import torch# 创建一个随机的图像张量&#xff0c;形状为 (N, C, H, W) # 这里 N 30&#xff08;帧数&#xff09;&#xff0c;C 3&#xff08;通道数&#xff09;&#xff0c;H 64&#xff08;…...

.bixi勒索病毒来袭:如何防止文件加密与数据丢失?

导言 在网络威胁剧烈的今天&#xff0c;勒索病毒已成为企业和个人面临的重大安全挑战&#xff0c;其中虫洞勒索病毒习得高强度的加密手段和急剧传播的特性引起关注。一旦感染&#xff0c;就会加密关键数据并索要赎金&#xff0c;导致数据无法访问并带来巨大的财务损失。更为严…...

MySQL安装配置教程

以下是 MySQL 在 Windows 系统下的安装配置教程: 1. 下载 MySQL 访问 MySQL 官方网站(https://dev.mysql.com/downloads/mysql/),根据您的操作系统版本(32 位或 64 位)选择合适的 MySQL 安装包。一般建议下载社区版(Community Server),它是免费且功能丰富的版本。2. …...

Pandas进行数据查看与检查

在数据分析的工作流中,数据的初步查看与检查是非常重要的步骤。通过这一步,可以快速了解数据的结构、属性以及一些关键的统计信息,确保数据符合预期,或者发现数据中的潜在问题。 借助 pandas 库中的常用方法,如 DataFrame.head()、DataFrame.tail()、DataFrame.info() 和…...

‌MySQL中‌between and的基本用法‌、范围查询

文章目录 一、between and语法二、使用示例2.1、between and数值查询2.2、between and时间范围查询2.3、not between and示例 BETWEEN AND操作符可以用于数值、日期等类型的字段&#xff0c;包括边界值。 一、between and语法 MySQL中的BETWEEN AND操作符用于在两个值之间选择…...

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

ctfshow——web(总结持续更新)

文章目录 1、基础知识部分2、php伪协议2.1 php://input协议2.2 data://text/plain协议 3、webshell连接工具3.1 蚁剑连接一句话木马 4、各个web中间件重要文件路径4.1 Nginx 5、sqlmap使用6、php特性6.1 md5加密漏洞 7、TOP 10漏洞7.1 SQL注入 1、基础知识部分 识别base64编码…...

selinux介绍和Linux中的防火墙

selinux 1、selinux的说明 2、selinux的工作原理 3、selinux的启动、关闭与查看 防火墙 1、什么是防火墙 2、iptables &#xff08;1&#xff09;iptables介绍 参数说明 3、firewalld firewalld-cmd的参数说明...

【模拟电路】Circuit JS:从零到一,构建你的首个交互式电路实验

1. 初识Circuit JS&#xff1a;你的虚拟电路实验室 第一次接触Circuit JS时&#xff0c;我正为一个简单的LED电路设计发愁。传统仿真软件要么安装复杂&#xff0c;要么收费昂贵&#xff0c;直到发现这个直接在浏览器里运行的免费工具。打开网页的瞬间&#xff0c;就像走进了中学…...

AI代码管理器:统一多模型编程助手,提升开发效率与代码质量

1. 项目概述&#xff1a;一个面向开发者的多模型代码管理技能最近在折腾AI编程助手&#xff0c;发现一个挺有意思的现象&#xff1a;很多开发者手头可能同时用着Claude、CodeGemini这类工具&#xff0c;但每次切换都得重新配置环境、调整提示词&#xff0c;甚至要处理不同模型输…...

OPAL:基于OPA的实时策略数据分发与权限治理实践

1. 项目概述&#xff1a;什么是OPAL&#xff0c;以及它解决了什么核心痛点&#xff1f;如果你在负责一个微服务架构或者分布式系统的权限管理&#xff0c;大概率遇到过这样的场景&#xff1a;每次权限策略有更新&#xff0c;都需要重启服务、重新部署&#xff0c;或者等待一个漫…...

CircuitPython HID设备模拟:从键盘鼠标到数据记录实战指南

1. 项目概述&#xff1a;从微控制器到智能交互设备在嵌入式开发的世界里&#xff0c;让一块小小的开发板“假装”成键盘或鼠标&#xff0c;直接控制你的电脑&#xff0c;这听起来像是极客的魔法&#xff0c;但其实是基于一个非常成熟且标准化的协议&#xff1a;HID。HID&#x…...

基于RP2350与CircuitPython的音乐可视化器DIY:从FFT到复古美学

1. 项目概述&#xff1a;从复古情怀到现代DIY如果你和我一样&#xff0c;对上世纪七八十年代那些充满未来感的电子设备抱有某种执念&#xff0c;那么Atari Video Music这个名字一定不会陌生。这台诞生于1977年的设备&#xff0c;堪称音乐可视化器的鼻祖&#xff0c;它通过简单的…...

ModbusTool:工业自动化通信调试的技术实现与实践指南

ModbusTool&#xff1a;工业自动化通信调试的技术实现与实践指南 【免费下载链接】ModbusTool A modbus master and slave test tool with import and export functionality, supports TCP, UDP and RTU. 项目地址: https://gitcode.com/gh_mirrors/mo/ModbusTool 在工业…...

等保2.0合规实战:Redis安全配置核查与加固指南

1. Redis安全配置入门&#xff1a;为什么等保2.0要求这么严格&#xff1f; 我第一次接触Redis安全配置是在一次等保2.0合规检查中。当时客户系统因为Redis默认配置导致数据泄露&#xff0c;整个项目组连夜加班整改。从那以后&#xff0c;我就养成了每次部署Redis必做安全检查的…...

电解电容核心参数解析:从ESR、纹波电流到选型实战

1. 项目概述&#xff1a;从“黑疙瘩”到电路心脏在电子工程师的物料盒里&#xff0c;电解电容绝对是个让人又爱又恨的家伙。它不像电阻那样温顺稳定&#xff0c;也不像芯片那样精密复杂&#xff0c;它就是个黑乎乎的圆柱体&#xff0c;或者扁平的方块&#xff0c;上面印着一些让…...

RK3588 NPU部署YOLOv8全流程:从ONNX转换到板端C++/Python推理优化

1. 项目概述&#xff1a;为什么要在RK3588上部署YOLOv8&#xff1f;最近在边缘计算项目里&#xff0c;我遇到了一个典型的需求&#xff1a;客户需要在本地设备上实时分析摄像头画面&#xff0c;识别特定物体并分割出它们的轮廓&#xff0c;同时要求设备功耗低、体积小、成本可控…...

告别SD卡!用Ubuntu主机给Jetson Orin Nano刷机,保姆级避坑指南(SDK Manager篇)

告别SD卡&#xff01;用Ubuntu主机给Jetson Orin Nano刷机&#xff0c;保姆级避坑指南&#xff08;SDK Manager篇&#xff09; 当第一次拿到Jetson Orin Nano Developer Kit时&#xff0c;很多开发者会本能地选择SD卡刷机方案——毕竟这是最"傻瓜式"的操作。但经历过…...