PHP应用性能优化指南

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

PHP简史

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

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

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

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

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

Performance

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

PHP代码优化最佳实践

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

1. 尽量的使用PHP的内置方法

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

2. 使用Json替代xml

json_encode()json_decode() 等PHP的内置方法,运行速度都很是快,全部应该优先使用Json。若是你没法避免使用xml,那么请务必使用正则表达式而不是DOM操做来进行解析。性能优化

3. 使用缓存技术

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

4. 减小没必要要的计算

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

5. 使用isset()和empty()

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

6. 减小没必要要的类

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

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

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

8. 关闭数据库链接

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

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

查询数据库时,使用聚合函数,能够减小检索数据库的频率,而且使程序运行的更快。

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

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

11. 尽可能使用单引号

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

12. 尝试使用恒等运算符

因为“===”仅检查闭合范围,所以比使用“==”进行比较速度更快。

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

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

1. 网络带宽

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

2. CPU

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

3. 共享内存

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

4. 文件系统

随着时间推移,你的文件系统可能会出现大量磁盘碎片。若是内存足够,利用内存做为文件缓存能够加快磁盘的访问速度。

5. 进程管理

检查服务器的进程,确保里面没有非必要的进程。移除哪些不须要的网络协议、病毒扫描软件、邮件服务以及硬件驱动。将PHP代码运行在多线程模式,也能提升程序的响应时间。

6. 相关的其它服务

若是你的应用程序还依赖于一些外部服务,那这些外部服务的性能瓶颈也有可能拖慢你的应用。虽然这种状况下你能作的事情很少,但你仍然能够经过你这一边的操做来减轻外部服务性能瓶颈对你的影响,例如切换到备用服务上等。

更多PHP性能优化建议

1. 发挥OPCache的优点

因为默认状况下,PHP代码在执行时都会从新编译为可执行的中间代码OPCode,所以能够及时看到修改的代码所带来的变化,而没必要频繁的重启PHP服务。不幸的是,若是每次在你的网站上运行时,都从新编译相同的代码会严重影响服务器的性能,这就是为何opcode缓存或OPCache 很是有用。

OPCache是一个将编译好的代码保存到内存中的扩展。所以,下一次代码执行时,PHP将检查时间戳和文件大小,以肯定源文件是否已更改。若是没有,则直接运行缓存的代码。

下图显示了运行无缓存的PHP应用程序,OPcache和eAccelerator(另外一个PHP缓存工具)三者的执行时间和内存使用状况的差别。

Prestashop

图片来源: Prestashop

2. 识别数据库响应延迟

如上所述,性能问题并不老是由代码引发的。大多数瓶颈都出如今应用程序必须访问资源的时候。因为PHP应用程序的数据访问层可能占用最高90%的执行时间,所以你应该采起的第一步是查看代码中访问数据库的全部实例。

确保打开SQL的慢日志,以帮助你识别和处理慢SQL,而后评估这些查询的执行效率。若是你发现查询过多,或者在单次执行过程当中发现相同的查询被屡次进行,你能够经过减小数据库访问时间进行调整,从而提升应用程序的性能。

3. 清理文件系统

清理文件系统,并确保没有使用文件系统来存储Session。最重要的是,请注意file_exists(),filesize()或filetime()等触发文件统计信息的代码。将任何这些功能置于循环中可能会致使性能问题。

4. 监控外部API接口

大部分对外部系统有依赖关系的应用都会调用远程API。虽然这些远程API接口你没法直接控制,但你仍能够采起一些措施来减轻源自远程API的性能问题。例如,你能够缓存API输出的数据,或者能够在后台调用这些API。为API请求设置合理的超时时间,而且若是可能的话,随时作好API没有响应的状况下的显示输出。

5. 使用工具评估检测你的PHP代码

使用OPcache和监控外部API接口应该足以使大多数应用程序运行顺利;可是,若是你发现系统负载不断增长,那么可能须要使用工具来对你的PHP代码进行检测评估。完整的PHP代码检测评估虽然可能很耗时,但它能够为你提供有关应用程序性能的深刻信息。幸运的是,有几个开源程序能够用于分析你的PHP代码,如Xdebug

监控PHP性能的重要性

若是你没有作好准备,你的Web应用可能前一分钟还在正常运行,可是下一分钟,一波忽然激增的流量就会致使你的应用程序崩溃。 固然,优化和重构老是须要时间、精力和资金,并且投入是否值得的也很难说。所以,作出明智决策的最佳方式是不断收集数据

PHP性能监控软件能够帮助你当即测量所作的任何更改的影响。固然,知道要监测什么一样重要。速度和内存使用被认为是性能的最佳指标,由于它们影响到页面加载时间,这对Web应用程序相当重要。

虽然数据收集很重要,可是当你不须要监控系统时,你应该关闭监控系统,由于大量日志一样也会对性能形成影响。固然,这样的日志能够提供有关如何提升性能的有用信息,所以你应该在高峰期间按期监控。

将来的PHP性能

PHP仍在不断进化中,在目前正在开发的PHP 8版本中,最新的功能是即时编译或JIT,它将能够为咱们建立更快的Web应用。随着技术的不断进步,用户的指望也随之增长。所以,开发人员必须始终关注将来的变化。

在构建Web应用程序时,请记住,今年的工做可能在明年不起做用。你可能须要进行调整才能持续保持优秀的PHP性能。在开发过程当中,应该持续重点关注如何构建适用于高并发场景的Web应用和网站,保证它们的高可用性。

参考文章

Using a PHP CDN Setup
How to Install Nginx PHP

扫描下方二维码或者微信搜索[phpjiagoushier],关注个人微信公众号[PHP架构],参与互动交流。

phpjiagoushier

相关文章
相关标签/搜索