PHP优化技术

发布于:2025-03-16 ⋅ 阅读:(20) ⋅ 点赞:(0)

最近在学习php语言,打算用来提升开发小项目的效率。下面是php项目中常见的优化手段。

1、引起php性能问题的原因

(1)php语法使用不当
(2)使用php做了它不擅长的事
(3)用php连接的服务不给力
(4)php自身的短板
(5)未知问题

2、php性能优化方案

如果我们是在做整个项目的性能优化,其中php性能优化只会占一部分,我们不要局限于优化php。
性能优化方向
PHP性能优化方向

  • PHP语言级的性能优化(这是最简单最明显的优化方法,从语法 层面,减少代码冗余)
  • PHP周边问题的性能优化(PHP项目会涉及到很多服务的连接,它周边的服务以及网络环境等都涉及到优化)
  • PHP语言自身分析、优化(PHP底层c语言编译优化)

php语言级性能优化

在这里插入图片描述
(1)经过压测发现,性能通常可以提升好几倍,这就要求php开发需要尽可能多地掌握内置变量、常量、函数。
在这里插入图片描述
(2)即使是相同功能的内置函数,php使用不同的函数也存在性能差异。对于高并发项目反复调用,也会引起性能差异。所以我们应该选择合适的内置函数。
在这里插入图片描述
(3)尽可能避免使用PHP魔法函数。但如果我们必须使用魔法函数或者魔法函数可以带来很大的方便,这时我们就要根据需要进行选择。
在这里插入图片描述

(4)
错误抑制符会产生额外开销。它的工作原理就是在代码开始前增加Opcode,忽略报错,在代码之后再恢复报错的等级。
使用错误抑制符不仅有额外开销,也不利用项目中异常的判断,不利于程序的健壮性。所以对于错误处理还是更推荐使用try catch来处理,而不是用错误抑制符来偷懒。
在这里插入图片描述
(5)合理使用内存,虽然脚本执行完,php会有内存回收机制来回收内存。但脚本执行过程中也会占用内存,争抢资源,应该使用unset()及时释放内存。(注:unset()会出现注销不掉的情况)
在这里插入图片描述
(6)尽量少的使用正则表达式。因为在php中使用正则表达式会进行回溯开销较大。所以php项目经常需要优化正则表达式,对于不熟练者,还是建议利用字符串函数来实现相同逻辑。
在这里插入图片描述
(7)避免在循环内做运算
在这里插入图片描述(8)减少计算密集型业务。众所周知,php底层是由c语言编写,每次运行需要转为c语言,由于它的语言特性决定了它不适合做大数据量运算。
在这里插入图片描述
(9)务必使用带引号的字符串做键值。一方面是因为php会将没有引号的键值当做常量,产生查找常量的开销。当常量不存在时,才会将其作为字符串处理。另一方面,如果是合作开发,当同事定义了一个名为key的常量,就会导致取值错误。

PHP周边问题的性能优化

在这里插入图片描述
在这里插入图片描述数据库不是基于磁盘建立的吗,为什么读写性能要由于读写磁盘?
这是因为数据库通常会将内存作为缓存,将热数据存放在内存中,将数据异步写入磁盘。所以性能要优于读写磁盘。
读写网络数据为什么更耗费性能?
读写网络数据是通过socket来建立连接,实际上也是操作磁盘进行读写数据,但相比读写磁盘,它还有额外的网络开销,受到网络延迟的影响。
(1)减少文件类操作
在这里插入图片描述
在这里插入图片描述

(2)开发中难免会使用网络连接,所以也应该优化网络请求。

  1. 设置超时时间
  2. 将串行请求并行化。其中curl_multi_*()有一个问题,当并发发送多个请求,它会将所有请求的响应同时返回,如果有一个请求耗时很长,会导致所有请求的耗时都边长。所以推荐使用swoole扩展。
    在这里插入图片描述
    (3)当我们使用php做接口输出时可以通过压缩来优化性能。但因为有额外的CPU开销,所以如果压缩内容较少,有时性能反而不如不压缩。当压缩内容较大或者压缩的内容中有很多重复的部分,压缩就能提升该接口的性能。
    在这里插入图片描述
    例如:smarty是php常用的一个模板引擎,可以使用smarty来开启caching

在这里插入图片描述
php脚本语言,是顺序执行语言,开发者使用久了会养成串行化的思想,但可以使用重叠时间窗口思想来优化。
重叠时间窗口思想其实也是串行转并行的一种方式。
什么时候可以使用重叠时间窗口这一思想?
只有当后一任务不强依赖于前一个任务的输出时才可以使用。
在这里插入图片描述
旁路方案与重叠时间窗口类似,也是当后一个任务不依赖于前一个任务输出时使用。
在这里插入图片描述
1、Opacode是php编译过程中接近于机器语言的代码,所以我们可以通过缓存它来提升性能。可以使用PHP扩展APC或者其他PHP扩展来将其缓存,APC已停止维护。
2、使用扩展来实现PHP代码中的高频逻辑,因为扩展是基于c语言写的,性能更好。(PHP代码虽然最终由解释器(用C写的)处理,但每次执行都需要解析、编译成opcode,再执行。而扩展直接编译进PHP核心,省去了这些步骤,执行的是原生机器码,它可以直接编译成机器码,所以更快)
3、Runtime优化,Runtime性能更好,运行在它上面的PHP才能达到更高的性能。比如HHVM,但据说目前有更好的其他方案。(​PHP 代码的执行依赖于 Runtime 提供的一系列底层支持,包括解释器、内存管理、扩展模块和运行模式等。)
总之,我们应该经常关注上面方案的落地实现,可能会有更好的实现可以使用。

本博客是基于Pangee老师的课程编写https://www.imooc.com/learn/205