结论
从上面分析来看 在基础的内存管理 变量 函数 运行机制方面 PHP本身并不会存在明显的性能差异 但由于PHP的动态运行特性 决定了 PHP和其他的编译型语言相比 所有的变量查找 函数运行等等都会多一些hash查找的CPU开销和额外的内存开销 至于这种开销具体有多大 可以通过后 续的基准性能和对比分析得出
因此 也可以大体看出PHP不太适合的一些场景 大量计算性任务 大数据量的运算 内存要求很严格的应用场景 如果要实现这些功能 也建议通过扩展的方式实现 然后再提供钩子函数给PHP调用 这样可以减低内部计算的变量 函数等系列开销
基准性能
对于PHP基准性能 目前缺少标准的数据 大多数同学都存在感性的认识 有人认为 QPS就是PHP的极限了 此外 对于框架的性能和框架对性能的影响很没有响应的权威数字
本章节的目的是给出一个基准的参考性能指标 通过数据给大家一个直观的了解
具体的基准性能有以下几个方面
裸PHP性能 完成基本的功能
裸框架的性能 只做最简单的路由分发 只走通核心功能
标准模块的基准性能 所谓标准模块的基准性能 是指一个具有完整服务模块功能的基准性能
环境说明
测试环境
Uname aPnux db forum test db baidu _ # SMP Wed Aug: : CST x _ x _ x _ GNU/Pnux
Red Hat Enterprise Pnux AS release (Nahant Update )
Intel(R) Xeon(R) CPUE@ GHz
软件相关
Nginx nginx version: nginx/built by gcc (Red Hat )
Php (采用php fpm)
PHP (cP) (built: Mar: : )
Copyright (c) The PHP Group
Zend Engine v Copyright (c) Zend Technologies
with eAccelerator v Copyright (c) eAccelerator by eAccelerator
bingo
PHP框架
其他说明
目标机器的部署方式 nginx php fpm php脚本
测试压力机器和目标机器独立部署
裸PHP性能
最简单的PHP脚本
?php
require_once ‘ /actions/indexAction php’;
$objAction = new indexAction();
$objAction init();
$objAction execute();
?
Acitons/indexAction php里面的代码如下
?php
class indexAction
{
pubPc function execute()
{
echo ‘helloworld!’;
}
}
?
通过压力工具测试结果如下
裸PHP框架性能
为了和 的对比 基于bingo 框架实现了类似的功能 代码如下
?php
require_once ‘Bingo/Controller/Front php’;
$objFrontController = Bingo_Controller_Front::getInstance(array(
‘actionDir’ = ‘ /actions’
));
$objFrontController dispatch();
压力测试结果如下
从该测试结果可以看出框架虽然有一定的消耗 但对整体的性能来说影响是非常小的
标准PHP模块的基准性能
所谓标准PHP模块 是指一个PHP模块所必须要具体的基本功能
路由分发
自动加载
LOG初始化Notice日志打印 所以的UI请求都一条标准的日志
错误处理
时间校正
自动计算每个阶段耗时开销
编码识别编码转化
标准配置文件的解析和调用
采用bingo 的代码自动生成工具产生标准的测试PHP模块 test
测试结果如下
结论
从测试数据的结论来看 PHP本身的性能还是可以的 基准性能完全能够达到几千甚至上W的QPS 至于为什么在大多数的PHP模块中表现不佳 其实这个时候更应该去找出系统的瓶颈点 而是简单的说OK PHP不行 那我们换C来搞吧 (下一个章节 会通过一些例子来对比 采用C来处理不见得有特 别的优势)
通过基准数据 可以得出以下几个具体的结论
PHP本身性能也很不错 简单功能下能够达到 QPS 极限也能过W
- redis的热点数据缓存 redis热点数据切换
- redis缓存失效怎么办 redis缓存数据不一致
- mongodb 更新子文档 mongodb数据文件无法新建
- mongodb查看数据库大小 查看mongodb集群容量
- mysql数据统计方案
- mysql创建数据表时指定字符集 mysql有符号创建
- mysql数据库优化 mysql订单优化
- redis哨兵模式数据不一致 redis为什么叫哨兵
- mongodb数据丢失原因 为什么mongodb数据库一直在加载中
- mongodb 查看数据库 mongodb查询数据库表
