PHP 性能优化

PHP虽然是世界上最好的语言,但是它本身作为一门脚本语言,其运行效率一直被人们所诟病。

作为以PHP为开发语言的应用程序而言,PHP程序的性能能影响到整个架构性能的百分之30左右,不会超过百分之50,其余的是硬件的、操作系统的、存储的等等其他性能优化;因此,PHP程序的性能好坏,对于整个系统架构而言,还是很重要的。

PHP的性能优化分为一下三个层次:

PHP.png

这三个层次性能优化的难度依次上升,效果却依次降低。在此,我们重点讨论前两种层次。

1. PHP代码的优化

多使用PHP内置的函数,少使用PHP代码,且精简PHP代码

PHP的执行流程为:


php_flow.png

这个原理是很简单的,PHP是解释型语言,PHP代码得经过好几步转化才能变成最终的机器码,假如PHP代码写的很多,不够精简,转化的步骤就会变长,自然会影响PHP程序的性能。而PHP内置的函数是由C语言编写的,运行速度自然快。

PHP内置函数的执行效率也有优先级,可以尽量使用快的

这个原因也是显而易见的,虽然都是C语言写的程序,但是C实现的方式还是不同的,有的实现方式快一些,有的实现的慢一些,所以调用快的效率肯定会高一点。
例如:

  • array_key_exists效率要比in_array
  • requirerequire_once效率高
  • 单引号''比双引号""效率高
减少PHP魔法函数的使用

PHP的魔法函数用起来很爽,但是既然用的这么爽,那么PHP在底层肯定帮你做了诸多事情,做的这么一堆事情,不能不消耗性能吧。
PHP魔法函数为了让程序员爽,在语言级别帮程序猿做了很多,会带啦性能开销,我们应该看情况酌情使用。

不要使用错误抑制符@

@错误抑制符这玩意儿的实现原理和魔法函数差不多,都是方便了程序猿苦了自己;原理也很简单,就是在添加了错误@符号的前面和后面添加了Opcode,Opcode的作用就是和error_reporting忽略错误一样一样的,然后在添加了@符号的代码之后再添加上一些Opcode,将错误等级恢复。

可以用PHP的Opcode查看扩展vld来查看添加了@符号的代码情况。(vld的使用也很简单,就俩指令vld.active=1vld.execute=0., vld.active=1表示想要用扩展,vld.execute=0.表示只是查看Opcode代码,vld.execute=1.表示要执行php程序。``php -vld.active=1 -vld.execute=0 xxx.php)

合理使用PHP内存,释放掉没用的变量

要尽量合理的使用内存,例如:

  • 从数据库中取字段,只取某个字段,就不要取出全部字段。 select xxx 和 select * 的区别
  • 读取文件,文件使用完后,文件close的问题
  • 使用unset及时释放掉无用的变量。(但是也会有unset不掉的情况)
尽量减少使用正则表达式

正则表达式需要回溯,当正则表达式越长,它回溯的开销就会越大,优化表达式也是个技术活儿,所以建议尽量使用PHP内置的处理函数来替代。

避免循环内做重复的计算

例如:

$str = "hello world";
for ($i = 0; $i<strlen($str); $i ++)
{
    //do something
}

strlen($str)是不是被重复计算了?有意义吗?写在外边不好吗?

避免数据密集型计算

PHP是由C语言来实现的,PHP本身在处理一些计算的时候,额外的开销是很大的,例如它的变量寄存、语言处理,都需要C来实现…PHP的“慢”,不是由于一些特性而“慢”,是整体就慢。所以在处理一些大批量数据例如大批量日志处理,大批量数据分析的时候,是十分不适合的,和C等语言比起来不是一个数量级。

PHP的语言特性决定了PHP不适合做大数据量的计算。
PHP适合做的事:

php_duty2222.png

PHP适合做一个纽带,适合做一些字符串、文本处理。

使用Opcode cache

Opcode是整个PHP中最接近机器码的地方,假如我们对Opcode做一下缓存,就节约了PHP代码解析、编译的开销,在此,我们可以使用一些扩展来对Opcode进行缓存

  • APC。(已经不更新)
  • 鸟哥的yac

2. PHP周边性能优化

php_around3333.png

以上就是PHP周边的环境。只有PHP周边的环境也得到了很好的性能优化,才能将PHP的系统架构发挥到极致。

不要使用过多的IO

PHP场景的性能开销次序为:读取内存 < 读取数据库 < 读取文件 < 读取网络数据

PHP是不适合编写IO密集型的程序。

优化网络请求
设置超时时间
  • 连接超时 200ms
  • 读超时 800ms
  • 写超时 500ms
将串行请求并行化
  • 使用curl_multi_*()的函数代替curl
  • 使用swoole扩展(比 curl_multi还要好)
合理的将PHP接口输出压缩

使用gzip可以将PHP接口输出压缩,提高我们的IO,但是压缩的过程需要额外的计算消耗,需要消耗部分CPU性能,需要合理使用;当数据量小于几十kb的时候,用gzip还不如不用,当gzip数据大于100k的时候,压缩是合理的,而且压缩的程度还和数据重复的个数有关,如果重复的多,gizp就压缩的小,如果重复的少,gzip压缩的就稍微大点儿。

3. 最后的解决方案

使用性能优化分析工具
  • Facebook的XHPorf
  • 压力测试工具Apache的ab
  • opcode代码分析工具vld
用PHP扩展代替部分逻辑

这个不用多说,很多大公司都是这么做的。
把很多PHP的library做成.so文件。

使用PHP7

HHVM是由Facebook推出的,用来提升PHPruntime效率的,效果十分明显。但是,就PHP7而言,官方觉得PHP7的engine更胜一筹,所以,如果想要整体提高性能,升级PHP7还是必要的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 1、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注...
    红鱼绿鱼与驴阅读 1,069评论 0 3
  • 总体介绍: 一、规范说明 性能是网站运行是否良好的关键因素, 网站的性能与效率影响着公司的运营成本及长远发展,编写...
    henryspace阅读 873评论 0 0
  • 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row['id'...
    红鱼绿鱼与驴阅读 182评论 0 0
  • 随着孩子年龄的长大,与父母之间的隔阂也变得越大。 关于孩子的隐私问题,我不知道家长怎么想的。每个人都需要自己的空...
    f7c64a05e8a9阅读 363评论 1 2
  • 付出了一定要得到回报,付出才有价值! 如果你去超市买东西,付了钱东西就不要了吗?但是放在其他地方,则是过程很重要,...
    拂晓飞阅读 292评论 1 0