Press "Enter" to skip to content

Yaf-3.1 10%性能提升版

Yaf(Yet Another Framework)是我的第一个发布的PECL扩展,也是我走上PHP内核维护的开始,我一直对它比较有感情,Yaf在过去的8年多时间里,也得到了不少朋友的喜爱,当然Yaf还是有很多不足,但毕竟Yaf主要还是针对性能场景,不能满足所有的需求。

即然Yaf == 性能,借着疫情的在家时间,又花了一些时间对Yaf做了一轮优化,希望能对性能有进一步的提升。

主要涉及到的有:

1. 重构了Yaf_Loader::autoload
2. 重写了Yaf_Route_Static/Rewrite的核心逻辑
3. is_localnamespace采用Hash匹配来取代之前的字符串匹配
4. 重写了大部分的逻辑以避免内存分配

因为改动比较大,所以也跳跃了版本,从3.0.9到3.1.0. 下载地址: Yaf At PECL

那么,还是老规矩,我们来测试下性能变化,首先采用yaf代码中的tools/cg/yaf_cg来生成一个测试:

tools/cg/yaf_cg benchmark /var/www/html/yaf

测试服务器配置:

32GB RAM 
Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz * 24
Nginx 12 processes
PHP-FPM 24 processes

我们首先用yaf-3.0.9版本来测试(200并发):

ab -n 100000 -c 200 http://10.33.1.23:8000/yaf/

Server Software:        nginx/1.9.7
Server Hostname:        10.33.1.23
Server Port:            8000

Document Path:          /yaf/
Document Length:        26 bytes

Concurrency Level:      200
Time taken for tests:   17.950 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      19100000 bytes
HTML transferred:       2600000 bytes
Requests per second:    5571.17 [#/sec] (mean)
Time per request:       35.899 [ms] (mean)
Time per request:       0.179 [ms] (mean, across all concurrent requests)
Transfer rate:          1039.15 [Kbytes/sec] received

然后我们用yaf-3.1.0来测试(200并发):

ab -n 100000 -c 200 http://10.33.1.23:8000/yaf/

Server Software:        nginx/1.9.7
Server Hostname:        10.33.1.23
Server Port:            8000

Document Path:          /yaf/
Document Length:        26 bytes

Concurrency Level:      200
Time taken for tests:   16.046 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      19100000 bytes
HTML transferred:       2600000 bytes
Requests per second:    6232.05 [#/sec] (mean)
Time per request:       32.092 [ms] (mean)
Time per request:       0.160 [ms] (mean, across all concurrent requests)
Transfer rate:          1162.42 [Kbytes/sec] received

可以看到,QPS从5571飙升到了6232, 11%的QPS提升。

当然了,这点提升对于一个实际项目来说,可能并不明显,我只是在这里说明下版本升级对比:)

另外毕竟这次改动变动的代码比较大, 虽然说已经尽力测试, 但可能还是会有问题, 如果大家在实际使用的时候遇到任何问题, 可以在Github上提Issue,或者直接发邮件给我laruence at php dot net, 注意邮件不要带附件,php的mail系统过滤有附件的邮件:< Enjoy!

18 Comments

  1. grabbyte
    grabbyte January 17, 2023

    这个版本application.dispatcher.defaultModule的配置是不是失效了?我写的博客,默认模块配置了竟然没作用了。

  2. word finder
    word finder April 16, 2021

    That’s good news, I’ve been searching for it for days

  3. tetris
    tetris March 3, 2021

    Thanks for the blog loaded with so much information. Stopping by your blog helped me to get what I was looking for.

  4. 上官江
    上官江 June 7, 2020

    感谢鸟哥的付出。有点小障碍,就是文档跟不上。版本改动很大,没足够的文档支持。导致升级或者迁移到新的环境下,安装了最新的yaf,程序全部崩掉了。因为一些的旧的方法突然不支持了,向下兼容不好。

    • laruence
      laruence June 8, 2020

      具体的问题,可以在github上提issue哈

  5. Jie Zheng
    Jie Zheng April 15, 2020

    一直在用 YAF 和 YaConf,用一句英文就是 Start Small, Finish Big(中文不知道怎么说)。我并没有使用自带的 Yaf_autoload,而是 unregister 掉了,而改为了 Composer。YAF 是非常好的,不会让你觉得碍手碍脚,在基本的 Request to Response 这个流程上,你可以随意扩展。一直期望的两个改动,在这个版本没有出现,有点儿小失落。

    一个是 YAF 的,希望可以支持 PSR-4 的命名空间,尤其是 Module, Controller, Action 的加载,而不是加载到全局下。
    一个是 YaConf 的,希望可以支持至少一层子目录,为不同的 app 做空间区分。当然,用 Docker 的话,这不是问题,所以不要紧。

    谢谢 鸟哥对 YAF 的开源与维护。

  6. hailin
    hailin April 15, 2020

    据说加入swoole的第三方生态应用列表要给swoole捐款

  7. joke
    joke April 11, 2020

    说真的写的文章越来越没技术含量, yaf框架也没几个人用, 用着感觉还特别不爽。这个框架除了路由还有啥特别的功能?命名规范啥的还特别的别扭, 一看就是没做过业务开发的人写的框架,为了写框架而实现的框架。还不帮帮rango一起完善完善swoole, 把php生态搞起来。现在用的php的公司不是转go就是转java。

    • Laruence
      Laruence April 11, 2020

      本来不想回复你,不过说句你可能不能理解的话,我写代码是为了我自己好玩,至于你用不用,我根本不Care,懂么?

    • 石阶上最肥大的开心
      石阶上最肥大的开心 April 12, 2020

      只回你最好一句。
      xxoole 本来是有生态的虽然很小并不完善,未来很期。现在是1 V1服务,产业链垄断这一套搞得不错。垄断是开源的反方向。做好自己憋掺和。知道垄断之后是干啥麻?(绿的心发慌

    • rocky
      rocky April 12, 2020

      你去完善swoole不就行了

    • Sam
      Sam June 28, 2020

      你还真是个joke

  8. ch
    ch April 7, 2020

    点赞啦

  9. baagee
    baagee March 30, 2020

    我来占个沙发,鸟哥真棒

  10. shagon
    shagon March 16, 2020

    感谢鸟哥

Comments are closed.