May31

【原创】msgpack无法识别定位错误的小技巧

Author: leeon  Click: 2166   Comments: 0 Category: php  Tag: php,msgpack

php下的msgpack扩展定义的反序列化方法没有捕获反序列化失败时候的状态情况。如果反序列化失败,magpack只会抛出warning错误,我们没办法直接通过magpack提供的方法获取执行结果状态。其实我们可以使用php的原生方法来识别warning错误,从而判断反序列化是否成功。如下代码就可以解决我们的问题:

[code="php"]
error_clear_last();
$ret = msgpack_unpack($recv);
if (error_get_last()) {
// 反序列化失败
} else {
// 序列化成功
}
[/code]

Feb15

【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)

Author: leeon  Click: 10813   Comments: 2 Category: php  Tag: php,yaf,phalcon,laravel,thinkphp,yii

     最近面试了不少人,绝大部分使用的是thinkphp和laravel这两个框架,真正高性能的框架yaf和phalcon反而没有人使用。我认为使用框架主要基于这几点因素:

1. 工程结构规范化

2. 代码格式规范化

3. 功能抽象化

4. 逻辑封装化

5. 底层核心透明化

     tp,laravel,yii的简单实用的上手难度不高,但是复杂封装又各有特点需要深入学习,虽然可以快速通过其丰富的组件功能来构建一个基本的网站,但是后期的学习曲线也比较高。不管是用哪种框架,都是基于MVC模式来设计。本质上都是通过统一的路由管理器来派发不同的控制器任务。本文我将通过直接的性能测评来选出PHP7版本下认为在性能和工程化上最优的PHP框架。

 框架 版本  说明 
 yaf 3.0.4   通过yaf自带的yaf_cg来初始化一个基本工程
 thinkphp 5.0.6   composer创建一个基本工程,关闭debug
 phalcon  3.0.3  通过phalcon-devtools工具创建一个基本工程
 laravel  5.4  composer创建一个基本工程,关闭debug
 yii  2.0.11  yii手工下载basic版本工程,关闭debug

      我们通过将5个工程分别部署成5个网站,并修改里面的首页控制器,均改为输出到页面“hello”字段来评测裸框架下的基准性能。基础测试环境采用负载稳定的树莓派3来运行,并通过另外一台树莓派2来进行ab压力测试。fpm进程设定为static模式,并设定fpm进程数为5个,opcache设为开启状态。

ab运行命令类似如下,并连续采样10次来分析持续压力下的框架稳定性。

ab -k  -c 20 -n500 -q http://127.0.0.1/

压力测试结果如下:

laravel phalcon 原生php yaf thinkphp yii

87.9 670.66 1258.67 1061.76 545.93 61.65

100.4 924.2 1331.67 1126.23 618.78 65.88

81.19 921.87 1352.38 1129.91 608.41 77.84

111.39 930.88 1355.48 1159.62 601.55 79.05

53.89 929.71 1367.68 1165.19 607.24 72.21

94.67 918.72 1482.87 1107 607.24 82

62.21 932.51 1374.17 1130.23 610.72 76.42

85.63 925.01 1674.64 1124.18 609.11 69.82

67.05 913.12 1828.11 1128.22 608.72 75.67

89.21 879.26 1809.36 1159.38 601.18 77.93

     我们可以看到原生的PHP依然是相当强悍的,yaf的性能比phalcon高,这是因为yaf框架只 包含最基本的路由配置加载,并未有任何高级封装,相比phalcon框架丰富的组件,yaf在内存加载启动上必然比phalcon要轻量化。我们可以看到PHP实现的thinkphp性能表现不俗,但lavarel和yii的性能确实有点差强人意了。

    yaf属于超轻量级的c级别裸框架,只集成了基本的视图和路由控制,如果要完成一个中等以上规模的网站的话,还需要集成非常多的第三方类库,如果在线上运营环境中使用,会因为php加载大量的第三方类库而影响到性能。

    phalcon基于c的实现几乎完整的实现了yii,laravel,thinkphp具备的功能特点,同时在性能上完胜了这三个框架,在性能和功能上做了一个比较好的平衡。对于一个可扩展架构的高性能PHP框架而言,phalcon具备了比PHP实现的框架更好的稳定性和开发效率。phalcon虽然在入门门槛上偏高,但是我们只要熟悉了他的框架结构,我们可以很快速的去实现任何web服务业务模型。phalcon具体的介绍将在下一章节中进行介绍。

Feb10

【原创】采用xhgui及tideways搭建PHP性能监控平台

Author: leeon  Click: 5334   Comments: 0 Category: php  Tag: xhgui,xhprof,tideways,php

      xhprof扩展已经三年多没有更新了,PHP7是没法直接使用xhprof来进行性能分析了。好在tideways出品了一款xhprof的进化版php性能分析插件,可以完美支持php7程序。网上关于如何使用tideways和xhgui搭建性能分析平台的教程已经有了很多,部署的话可以参考借鉴这篇文章https://segmentfault.com/a/1190000007580819,但是在搭建过程中还是遇到了一些问题,需要说明一下。

   1. 当git clone https://github.com/perftools/xhgui.git xhguid的源后,注意你的php代码中必须安装mogondb的扩展,否则在php install的时候会出现调用composer安装第三方库失败,composer下载的vendoer资源也是需要依赖pecl的mogondb库的。这点在官方的配置文档中并没有提及。

  2. xhgui在配置nginx的时候官方文档也有些问题,需要注意这里

这里需要修改成:

        location / {

                 try_files $uri $uri/ /index.php?$query_string;

        }

如果不修改这个配置,xhgui里面集成的slim框架无法正常解析到路由数据。
 3.xhgui里面集成的slim框架有一个轻微语法出错,会导致php7下warning级别错误,请修复vendor\slim\views\Slim\Views\Twig.php文件的render方法,父类定义了第二个参数,但继承的类中没有指定导致warning报错,将第二个参数添加上即可:
public function render($template, $data = NULL)

xhgui属于无侵入式的代码性能监控方案,对于现有的代码不需要原先xhprof那样在代码中埋点指定xprof的文件路径,我们仅仅需要在对应的项目工程nginx配置中加入如下的代码:

[code="plain"]
fastcgi_param TIDEWAYS_SAMPLERATE "25";
fastcgi_param PHP_VALUE "auto_prepend_file=/usr/local/nginx/html/xhgui/external/header.php";
[/code]

第二行配置请根据自己的xhgui存放路径进行填写。

Nov28

【原创】关于APCU序列化在PHP7中使用的注意事项

Author: leeon  Click: 4550   Comments: 0 Category: php  Tag: php,apcu,php7

这两天线上服务器fpm频繁coredump,strace跟踪到php返回

write(2, "zend_mm_heap corrupted\n", 23) = 23

当时以为是php内核内存触发的bug,由于线上环境部署的是最新版本的php7+phalcon3,所以刚开始是怀疑新版本的程序的兼容性问题,但是在线下环境下模拟还原线上的所有基础环境时发现并不是如此,故一一比对线上的不同,发现运维在配置文件中使用了与线下不同的配置项,我们的程序同时用到了apcu的扩展,发现运维在配置的时候指定了apcu的序列化方法:
apc.serializer=igbinary
采用的是igbinary算法,但是我们线上新部署的环境中并没有支持到这个算法的扩展,故导致了问题发生。
解决方法为从pecl中下载igbinary扩展,安装并配置到ini文件中即可。
备注:
原先运维在使用php5.6的时候并没有直接编译igbinary,但是配置文件中依然指定了igbinary,php5.6进程并不会发生coredump如果igbinary不存在就会跳过采用原生的序列化,但php7针对igbinary的判断应该做了改变。

分类

标签

归档

最新评论

Abyss在00:04:28评论了
Linux中ramdisk,tmpfs,ramfs的介绍与性能测试
shallwe99在10:21:17评论了
【原创】如何在微信小程序开发中正确的使用vant ui组件
默一在09:04:53评论了
Berkeley DB 由浅入深【转自架构师杨建】
Memory在14:09:22评论了
【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)
leo在17:57:04评论了
shell中使用while循环ssh的注意事项

我看过的书

链接

其他

访问本站种子 本站平均热度:8823 c° 本站链接数:1 个 本站标签数:464 个 本站被评论次数:94 次