当前位置: 首页 > 后端技术 > PHP

PHP应用程序性能优化指南

时间:2023-03-30 03:02:36 PHP

程序员喜欢最新的PHP7,因为它使PHP成为执行速度最快的脚本语言之一(参见PHP7与HHVM比较)。但是保持最佳性能不仅需要快速的代码执行,还需要我们知道影响性能的问题点,以及这些问题的解决方案。本文涵盖了所有知识点,保证PHP应用程序的流畅高速运行。海量干货来袭,强烈建议收藏。PHP简史PHP于1995年由RasmusLedorf开发。起初只是Ledorf为了维护个人网页用c语言开发的一些CGI工具集。我们从缩写“PersonalHomePage”(个人主页)的原始出处就可以看出这一点。然而,随着Ledorf不断扩展其功能,PHP逐渐变成了现在的“PHP:HypertextPreprocessor”。在过去的20年里,PHP开发团队一直致力于提高PHP的性能,最著名的是1999年推出的Zend语法解释器引擎。2000年发布的PHP4包含内置的编译器和执行器模型,使PHP能够开发动态网络应用程序。2015年,PHP发布了里程碑版本PHP7.0,大大提升了Zend引擎的性能,降低了PHP的整体内存占用。截至本文发布时,最新的PHP版本为7.1.4。如果您有兴趣,可以阅读这篇文章PHP7的新特性和变化。什么才算是高性能PHP应用程序?性能和速度不是同义词。实现最佳性能通常需要在速度、准确性和可扩展性之间进行权衡。例如,在开发Web应用程序时,如果速度是您的首要任务,您可能会编写一个将所有内容加载到内存中的脚本,而如果可伸缩性是您的首要任务,您可能会编写一个以块的形式加载数据的脚本。内存脚本。基于phpLens研究,下图显示了速度和可扩展性之间的理论权衡。红线代表针对速度优化的脚本,蓝线是可扩展性优先的脚本。当并发连接数低时,Redline运行速度更快;然而,随着并发连接数的增加,Redline变得越来越慢。随着并发连接数上升,蓝线也变慢;然而,下降并不那么显着,因此在某个阈值之后,速度优先的脚本将比可扩展性优先的脚本慢。然而,在现实中,一些脚本可能会随着运行环境的变化而表现出不同的性能差异。您需要仔细观察用户的使用情况和应用的并发请求数,适时调整合适的优化策略。PHP代码优化最佳实践编写良好的PHP代码是创建快速稳定的Web应用程序的关键步骤。从一开始就遵循一些最佳实践技巧将节省以后填补漏洞的时间。1、尽量使用PHP的内置方法,只要能使用PHP的内置方法就尽量使用,而不是自己写同样的函数。花时间熟悉和学习PHP的内置方法,不仅可以帮助你更快地编写代码,还可以让你编写的代码运行起来更有效率。2.用Json代替php内置的xmljson_encode()、json_decode()等方法,运行速度非常快,所以优先使用Json。如果您无法避免xml,那么一定要使用正则表达式而不是DOM操作来进行解析。3.使用缓存技术Memcache尤其适合减少数据库负载,而字节码缓存引擎如APC或OPcache可以节省脚本编译时的执行时间。4.减少不必要的计算当一个变量会被多次使用时,一开始就计算它肯定比每次使用都计算效率更高。5、使用isset()和empty()与count()、strlen()和sizeof()函数相比,isset()和empty()检测变量是否为空更简单高效。6.减少不必要的类如果你不打算重用一个类或方法,那么它存在的价值就很小。而如果一定要定义和使用一个类,就需要合理规划类中的方法。对于不是特别public的方法,尽量放在子类中,因为调用子类中的方法比调用父类方法要快。快点。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服务。不幸的是,每次在您的网站上运行时都重新编译相同的代码会严重影响服务器性能,这就是操作码缓存或OPCache如此有用的原因。OPCache是一种将编译后的代码存储在内存中的扩展。因此下次代码执行时,PHP会检查时间戳和文件大小,以查看源文件是否已更改。如果没有,直接运行缓存的代码。下图显示了在没有缓存的情况下运行PHP应用程序时OPcache和eAccelerator(另一种PHP缓存工具)在执行时间和内存使用方面的差异。图片来源:Prestashop2。识别数据库响应延迟如上所述,性能问题并不总是由代码引起的。大多数瓶颈发生在应用程序必须访问资源时。由于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仍在不断发展,在目前正在开发的PHP8版本中,最新的特性是即时编译或JIT,这将使我们能够创建更快的Web应用程序。随着技术的不断进步,用户的期望也在不断提高。因此,开发人员必须时刻关注未来的变化。在构建Web应用程序时,请记住今年有效的方法明年可能无效。随着时间的推移,您可能需要进行调整以保持良好的PHP性能。在开发过程中,应该持续关注如何构建适合高并发场景的Web应用和网站,保证其高可用。参考文章UsingaPHPCDNSetupHowtoInstallNginxPHP扫描下方二维码或微信搜索【phpjiagoushier】,关注我的微信公众号[PHP架构],参与互动交流。