亲啊嘴金,发布于:2025-04-03T20:27:55 | 0 浏览
frankenphp 一些体验在2025年
祖传写PHP几十年,而且一直以来写的都是 standard Php,而且偏执的没有去用过 Swoole 之流的框架。
standard Php 的执行过程就是存在每一次的 http request 的生存期的。而且 没有异步 没有多线程 没有协程 没有事件模型 没有回调,代码执行规则就是第一行 2 3 同步每一行这样往下执行。
所以近期我在极限优化我这个博客执行速度,就现在你能读到这个文字,都是Php即时生成的。那些什么静态化优化方案不在此次探寻范围。
因为基于上面这个原则,Php写web程序整个切面执行周期就很好理解
一个 webserver app 转发 -> 需要解析的 uri 请求到 ->
php-fpm 进程池 -> 进程池甄选了这个请求->
php代码 解析了 -> 发回给 webserver ->
webserver 序列化 -> response 反馈给浏览器。
这个是 nginx 家族的传统玩法;其实有「切面编程」经验视角来看这一套流程真的是很完美的。
再比如 Apache httpd 也可以搭配 mod_fcgid 这么玩。
还可以 Apache httpd filter 玩法;但是万变不离其宗,依旧是 同步代码 变量的生存期在 每一次的 request (现在好多新生代人云亦云程序员都无法理解这种运行模型)
但是我说把后台开 php -s 开一些Php自带的 webserver 监听,Nginx 作为负载均衡前端,转发请求,他们这些新生代「晕程序员」就能听懂了。。
再之后就看到了 frankenphp 这个登西,看到这个登西的原因也很简单,因为受到冷眼和嘲笑,他们在强推go语言,让我不要赛博朋克守旧Php,go语言的webserver 就是caddy,而frankenphp 这个登西呢,他就是把Php封装进了 caddy 里面。没有像 Swoole 魔改,更加没有魔改Php自带的 webserver,frankenphp官方说,他介个登西更像是 Apache httpd mod_php 玩法,并且呢,提供一个worker模式,worker模式我一看就能理解了,就是设置一个长生存期对象;补足 nginx + php-fpm 进程池打法。
我下载的是:https://github.com/dunglas/frankenphp/releases/ frankenphp-linux-x86_64-gnu 1.5 版本。
配置文件来自:https://frankenphp.dev/cn/docs/config/ “最小配置” 只开启了 zstd 压缩。 和 关闭任何压缩 测试。
Php版本都是8.4.5;机器都是用一个系统下;
直接说结论。就是frankenphp比我目前的 php-fpm 进程池打法毫无差异。加载速度都是一样的。 standard Php Gd绘图部分同步代码执行速度也是一样的。读取数据库也是一样的。其实也很符合预期,因为本来就没对standard Php有任何魔改。。
不过这里也有些小细节很值得提:
|特点|FrankenPHP|我自己编译的PHP
|----------------------|-------------------------|-------------
|线程安全|采用线程安全法编译|非线程安全编译
|静态编译|静态编译 Php|非静态编译
|MySQL 扩展|mysql mysqli mysql_pdo |disable Mysql 家族 (禁用)
|Curl HTTP/3 支持|支持Http3|不支持Http3
|Curl QUIC 支持|支持quic|不支持quic
|SSH2 扩展包|FTP、啥的都编译齐了 |我没用到的都禁了
再然后我又仅开启了Zstd运行;
Zstd压缩主要在 webserver response 这个切面层操作。frankenphp 就比较优秀了,带上压缩只增加了20ms响应时间。
这方面比我自己写的 Apache httpd zstd [https://github.com/foglede/mod_zstd](https://github.com/foglede/mod_zstd) 压缩强悍得多,我自己写的 mod_zstd 同一内容压缩要增加90ms时间。我用17级的zstd压缩等级,我并未找到 frankenphp zstd 压缩等级在哪设置。
nginx 上也有 Zstd 压缩的插件,我依然输,frankenphp 依然小胜 nginx 几毫秒。。这段可以开个新话题探究。
不过话说回来,折腾来折腾去,我被现在的晕程序员问得最多的,就是没有全局长生存期变量、没有编译执行、没有异步、多线程、Php程序员当年是如何走过来的。。