什么情况下,遇到了PHP性能问题?

答:

  • PHP语法使用的不恰当
  • 使用PHP语言做了它不擅长做的事
  • 用PHP语言连接的服务不给力
  • PHP自身的短板
  • 也不知道的问题!!!

PHP的性能问题的解决方向:

 

 压力测试工具简介:

Apache Benchmark(ab)

简介:ab是由Apache提供的压力测试软件。安装apache服务器时会自带该压测软件。

如何使用:

./ab                   -n1000                   - c100                     http://www.baidu.com/

                         -n请求数           

                                                      -c并发数

                                                                                      url目标压测地址

PHP语言级性能优化:

优化点:少写代码,多用PHP自身能力

性能问题:自写代码冗余较多,可读性不佳,并且性能低。

为什么性能低?

PHP代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。 PHP代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。

       

举例:

1代码量居多     2代码量居少

 

 性能压测区别:

。左1。。右2。。

 

 

 好的方法:多使用PHP内置变量、常量、函数

                 

PHP代码运行流程:

 

 优化点:PHP内置函数的性能优劣

                 情况描述:PHP内置函数,之间依然存在快慢差异

                 好的建议:多去了解PHP内置函数的时间复杂度

举例:

 

优化点:少用PHP魔术方法

在实际处理中,若PHP魔法函数处理起来可以比较简便时,需做抉择

在Linux中,使用命令:time php.test.php 可以查看test.php耗时时间,主要关注user的时间

 

 

 

优化点:产生额外开销的错误抑制符@

          情况描述:PHP提供的错误抑制符只是为了方便“懒人”

         @的实际逻辑:在代码开始前、结束后,增加Opcode。忽略报错

 

vld - PHP Opcode查看扩展

 

 总结:

1、使用php扩展vld可以查看Opcode

2、命令php -dvld.active=1 -dvld.excute=O

3、test.php中active=1表明用vld扩展,execute-O只想查看Opcode,并不想执行。

4、在开发中尽量少用@错误抑制符。可以使用trythrow来抛出异常

 

优化点:合理使用内存

             情况描述:PHP有内存回收机制保底,但也请小心使用内存

             好的建议:利用unset()及时释放不使用的内存(注:unset()出现注销不掉的情况)

 

优化点:尽量少的使用正则表达式

             情况描述:正则表达式的回溯开销较大,“没有金刚别揽瓷器活”

             好的建议:利用字符串处理函数,实现相同逻辑

 

优化点:避免在循环内做运算

               情况描述:循环内的计算式将会被重复计算

               代码示例:

                            

 

 优化点:减少计算密集型业务

               情况描述:PHP不适合密集型运算的场景

               为什么?

                       PHP语言性决定了PHP不适合做大数据量运算

                    (php的底层是c,php的运算、处理流程都需要转换成c来实现,加上PHP的运行环境因素,其效率不如c)

              PHP适用场景:

                       适合衔接Webserver与后端服务、UI呈现

 

优化点:务必使用带引号字符串做键值

                情况描述:PHP会将没有印好的键值当作常量,产生查找常量的开销

                好的建议:严格使用引号作为键值