来自 澳门威尼斯人平台 2020-01-16 12:28 的文章
当前位置: 澳门威尼斯人平台 > 澳门威尼斯人平台 > 正文

性能优化之PHP

程序员都喜欢最新的PHP 7,因为它使PHP成为执行最快的脚本语言之一(参考PHP 7 vs HHVM 比较)。但是保持最佳性能不仅需要快速执行代码,更需要我们知道影响性能的问题点,以及这些问题的解决方案。本文涵盖了保障PHP应用平稳高速运行的所有知识点,大量干货来袭,强烈建议收藏。

图片 1

这是在慕课网上《性能优化之php》记下来的笔记,防止遗忘。

图片 2

图片 3

一、语言级性能优化

PHP简史

PHP是由拉斯姆斯·勒多夫于1995年开始开发的。起初,它只是勒多夫为了要维护个人网页,而用c语言开发的一些CGI工具程序集,我们从PHP这个缩写最初的来源“Personal Home Page”(个人主页)就可以看出这一点。然而,随着勒多夫不断地扩充它的功能,PHP逐渐成为了现在的“PHP:超文本预处理器”。

在过去的20年中,PHP的开发团队一直致力于提升PHP的性能,最引人瞩目的是于1999年引入的Zend语法解释器引擎。2000年发布的PHP 4,包含了一个內建的编译器和执行器模型,使得PHP开始有能力开发动态的Web应用。2015年PHP发布了里程碑式的版本PHP 7.0,极大的提升了Zend引擎的性能,并降低了PHP的整体内存使用率。截止到本文发稿为止,目前最新的PHP版本是7.1.4,有兴趣的话可以看看这篇文章PHP7 新特性,改变变化。

图示为100个并发,请求1000次目标地址

1、优化点:少写代码,多用PHP自身能力
1)性能问题:自写代码冗余较多,可读性不佳,并且性能低
2)为甚么性能低:PHP代码需要编译解析成为底层语言,这一过程每次请求都会处理一边,开销大
3)好的方法:多使用PHP内置函数、变量、常量
    例如array_merged,数组合并,先插入数组1,然后数组2插入,先判断元素是否存在,存在则忽略,否则插入

怎样才算是高性能的PHP应用?

性能和速度不是一对同义词。实现最佳性能通常需要在速度、准确性和可扩展性之间进行权衡。例如,在开发Web应用时,如果你优先考虑速度,你可能会编写一个将所有内容都载入内存的脚本,而如果从可扩展性出发,可能你就会编写以块为单位将数据载入内存的脚本。

基于phpLens的研究,下图展示了速度与可扩展性之间理论上的权衡关系。

图片 4

红线表示针对速度进行了优化的脚本,蓝线是可扩展性优先的脚本。当并发连接数低时,红线运行速度更快; 然而,随着并发连接数量的增加,红线变慢。当并发连接数上升时,蓝线也减慢;然而,下降并不那么剧烈,因此,在一定阈值后,速度优先的脚本会比可扩展性优先的脚本慢。然而,在现实当中,一些脚本可能随着运行环境的变化而表现出前后不同的性能差异。你需要仔细的观察用户的使用情况,以及应用的并发请求数量,来适时调整合适的优化策略。

图片 5

2、优化点:PHP内置函数的性能优劣
1)情况描述:PHP内置函数,之间依然存在快慢差异
2)好的建议:多去了解PHP内置函数的时间复杂度
3)isset()和array_key_exists()方法间的性能差异

PHP代码优化最佳实践

编写好的PHP代码是创建快速稳定Web应用的关键一步。从一开始就遵循一些最佳实践技巧将节省后期填坑的时间。

进行测试

3、优化点:尽可能少用魔法函数
1)情况描述:PHP提供的魔法函数,性能不佳
2)为什么性能低:为了给PHP程序员省事
3)好的方法:尽可能规避使用PHP魔法函数

1. 尽可能的使用PHP的内置方法

只要可以尽可能的使用PHP的内置方法,而不是自己编写相同功能的方法。花点时间去熟悉和学习PHP的内置方法,不但可以帮助你更快的编写代码,而且可以使你编写的代码更高效的运行。

图片 6

4、优化点:产生额外开销的错误抑制符
1)情况描述:PHP提供的错误抑制符只是为了方便懒人
2)@的实际逻辑:在代码开始前、结束后,增加opcode,忽略报错;
vId-PHP Opcode查看扩展:显示Opcode的信息显示出来

2. 使用Json替代xml

json_encode()和json_decode() 等PHP的内置方法,运行速度都非常快,所有应该优先使用Json。如果你无法避免使用xml,那么请务必使用正则表达式而不是DOM操作来进行解析。

最重要的两个参数:Requests per second :每秒接受请求数,这里每秒接收101个请求

5、优化点:合理使用内存
1)情况描述:PHP有内存回收机制保底,但也请小心使用内存
2)好的建议:利用unset()及时释放不使用的内存(注:unset()出现注销不掉的情况)

3. 使用缓存技术

Memcache特别适用于减少数据库负载,而像APC或OPcache这样的字节码缓存引擎在脚本编译时可节省执行时间。

         Time per request:一个请求用多少耗时,这里是9毫秒

6、优化点:尽量少的使用正则表达式
1)情况描述:正则表达式的回溯开销较大
2)好的建议:利用字符串处理函数,实现相同逻辑

4. 减少不必要的计算

当一个变量会被多次使用时,一开始就计算好,肯定要比每次使用时都计算一遍要更高效。

第一个参数越大越好,第二个参数越小越好

7、优化点:避免在循环内做运算
1)情况描述:循环内的计算式将会被重复计算
2)别在for中计算count

5. 使用isset()和empty()

与count()、strlen()和sizeof()函数相比,isset()和empty()对于检测一个变量是否为空等场景更加简单和高效。

优化方法之语言级性能优化1

8、优化点:减少计算密集型业务
1)情况描述:PHP不适合密集型运算的场景
2)为什么?PHP语言特性决定了PHP不适合做大数据运算(底层语言为C)
3)适用场景:适合衔接WebServer与后端服务、UI呈现

6. 减少不必要的类

如果你不打算重复使用一个类或者方法,那么它就没什么存在的价值。而如果你必须要定义和使用一个类,则需要合理规划类中的方法,对于不是特别公用的方法,尽量将他们放到子类中去,因为调用子类中的方法,比调用父类方法速度更快。

图片 7

9、优化点:务必使用带引号字符串做键值
1)情况描述:PHP会将没有引号的键值当做常值,产生查找常量的开销
2)好的建议:严格使用引号作为键值

7. 在生产环境关闭用作调试的相关代码及错误报告

开发时打开错误报告,可以让你避免很多潜藏的Bug,而一些调试代码也有助于你定位Bug,但是当代码部署到生产环境后,这些错误报告和调试代码会拖慢你的程序速度,而且将一些错误报告直接显示给用户,也具有相当的安全风险。因此,在生产环境请关闭它们。

PHP代码执行流程:

二、周边性能优化

Linux环境、PHP、硬盘、数据库、内存(缓存基于内存)、网络
DB和PHP 运行环境可以忽略,很可能是网络耗时与数据库操作耗时

8. 关闭数据库连接

当使用完毕后,注销变量和关闭数据库连接,可以释放珍贵的内存资源。

图片 8

1、减少文件类操作
1)常见PHP常见的开销次序:读写磁盘、读写数据库、读写内存、读写网络数据
2)读写内存(因为PHP直接通过引擎读取内存)<<读写数据库(数据库基于本地磁盘,但一般会使用热内存,缓存在内存中,异步写入磁盘)<<读写磁盘<<读写网络数据(socket,网络延迟)

9. 使用聚合函数减少数据库查询

查询数据库时,使用聚合函数,可以减少检索数据库的频率,并且使程序运行的更快。

PHP代码通过zend引擎逐行扫描,成为zend引擎能理解的语法,转码解析成Opcodes,执行之后输出

2、减少PHP发起请求
1)优化网络请求
    坑:对方接口的不确定因素、网络稳定性
2)方法:
    设置超时时间:a)连接超时——不超过200ms;b)读超时——不超过800ms,最多不能大于1s多;c)写超时——不超过500ms
    将串行请求并行化:a)使用curl_multi_*(),注意当使用curl_multi_exec时,多个请求同时发起,但返回时间依赖于最长的那个请求时间,这是最简单但不是最好的;b)使用swoole扩展,推荐这个

10. 使用强大的字符串操作函数

举个例子,str_replace()比preg_replace()要快,而strtr()函数则比str_replace()函数快四倍。

如果多使用内置函数的话,在扫描和理解上时间就会快很多,Opcodes也会少一些,执行起来就会快

3、压缩PHP输出的利与弊
1)如何压缩?
    使用Gzip即可
2)利:利于数据输出,client端能更快获取数据
     弊:压缩使服务端和客户端都额外的CPU开销(业务庞大的时候出现问题),当我们的数据小于几十K的时候,压缩效果不理想,若大于100K,则可以压缩会几十K

11. 尽量使用单引号

如果可能,尽量使用单引号替代双引号。程序运行时,会检查双引号中的变量,这会拖慢程序的性能。

优化方法之语言级性能优化2

4、PHP缓存复用
1)什么情况下做输出内容的缓存:
    多次请求,内容不变的情况
    流程:X.php先查看cache,如果命中,则返回cache,否则进行计算、数据处理进入cache再返回

12. 尝试使用恒等运算符

由于“===”仅检查闭合范围,因此比使用“==”进行比较速度更快。

图片 9

5、smarty调优和重叠时间窗口思想
1)Smarty开启caching
2)重叠时间窗口思想

PHP代码之外的性能瓶颈因素

优化代码当然能够提高PHP的性能。但是,还有一些代码之外的因素也会成为PHP的性能瓶颈。这就是为什么程序员需要了解代码部署的整个服务器环境,这有助于他们在编写代码时有一定的心理准备,并能够在性能出现问题时,快速识别和定位性能瓶颈。以下是你遇到性能瓶颈时需要检查的点。

优化方法之语言级性能优化3

三、PHP性能分析

1. 网络带宽

如果网络带宽不够,其传输的总数据量将会受到严重影响,使其成为最明显的性能瓶颈。

图片 10

1、工具XHProf(源自于Facebook的php性能分析工具)
1)php —ri xhprof检查扩展是否安装
xhprof_enable();
….
$data = xhprof_disable();//返回性能分析
include_once xhprof_lib.php;
include_once xhprof_runs.php;
$objXhprofRun = new XHProfRuns_Default();
$run_id = $objXhprofRun->save_run($data,”test”);
var_dump($run_id);
xhp,可以查看性能数据
Incl. Wall Time表示我以及我之后的所有方法的耗时
Excl Wall Time表示我的耗时
ctrl+u查看源代码

2. CPU

如果只是传输一些纯静态的HTML,则不需要消耗很多CPU资源,但是PHP毕竟创建的是动态的应用程序,根据应用的需要,你可能至少需要一台具备多核处理器的服务器来提升PHP代码的运行效率。

测试

其他推荐工具

ab——压力测试
vId——opcode代码分析

3. 共享内存

缺少共享内存可能会影响进程间通信,从而影响程序性能。

图片 11

四、PHP性能瓶颈解决方法

1、opcode cache:PHP扩展APC
2、pecl.php.net
3、扩展实现:通过PHP扩展代替原PHP代码中高频逻辑
4、runtime优化:HHVM(后来发力不足)

本文由澳门威尼斯人平台发布于澳门威尼斯人平台,转载请注明出处:性能优化之PHP

关键词: