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

PHP性能优化方法总结

时间:2023-03-29 18:50:38 PHP

什么情况下你会遇到PHP性能问题?1:PHP语法使用不当。2:用PHP语言做它不擅长的事情。3:PHP语言连接的服务不强大。4:PHP自身的不足(PHP自己做不到的事情)。5:我们也不知道的问题?(探索、分析、寻找解决方案,提高发展境界)。在线站点做压力测试的时候,一定要把请求数和并发数,尤其是并发数设置的比较低。我们不能在在线网站上造成压力问题,无论是我们自己的还是别人的。PHP性能问题一般不会超过整个项目性能的50%,一般在30%到40%。PHP性能问题的解决方案分为三个级别。1:PHP语言级性能优化指的是PHP语法的基本功能。这部分优化比较简单,容易看,快速可行,比较快就能看到效果。a:少写PHP代码,用PHP自身的能力解决问题。性能问题:自写代码冗余多,可读性差,性能低,比如代码很长……PHP代码越长,PHP的执行效率越慢。为什么性能低?PHP代码需要解析编译成C语言,底层的C语言要编译成汇编语言机器语言才能执行。这个过程必须在每次请求后处理,所以开销非常大(如果项目变大...)。解决方案:使用更多的PHP内置变量、常量和函数。我们用PHP代码实现的功能和用PHP内置函数实现的相同功能是有区别的。b:PHP内置函数的性能好坏。情况描述PHP内置函数在速度上还是有差距的;少用PHP魔术方法;建议:多了解PHP内置函数的实现复杂度。测试方法:比较效率测试,比如使用microtime()函数,取差,精确到毫秒级;linux的time命令可以查看开销。c:产生额外开销的错误抑制符号“@”最好不要使用(不考虑性能优化和项目健壮性)。@的逻辑是在代码前和代码结束后添加Opcode。Opcode的作用是忽略错误报告。其实相当于加上了error_reporting设置,级别错误报告被忽略(vld扩展可以查看隐藏的Opcode);d:合理使用内存。情况描述:PHP有内存回收机制来保证底线,但要谨慎使用内存;建议:使用unset()及时释放不用的内存,比如数据库中的一些冗余字段(注意:unset()有时不能取消)e:少用正则表达式。情况描述:正则表达式成本高,使用方便,但是由于正则表达式需要回溯,性能低下;正则表达式越长,回溯的开销越大。优化正则表达式需要技术水平,正则技术达不到标准,不要乱用正则化。f:避免在循环内进行计算。情况描述:循环中的计算公式会被重复计算(我们在for循环或者while循环中,都会有重复计算,会影响性能问题)。例子:错误用法:$str="helloworld";for($i=0;$iprop++)比递增局部变量慢3倍。增加一个非预定义的局部变量比增加一个预定义的局部变量慢9到10倍。16.只定义一个局部变量而不在函数中调用它也会减慢速度(程度相当于自增一个局部变量)。PHP可能会检查全局变量是否存在。17.方法调用好像和类中定义的方法个数没有关系,因为我加了10个方法(测试方法前后都有),性能没有变化。18.派生类中的方法比基类中定义的相同方法运行得更快。19.调用一个带参数的空函数只要7到8个局部变量增量。类似的方法调用需要将近15个局部变量增量。20.Apache解析PHP脚本的时间比解析静态HTML页面慢2到10倍。尽量使用静态HTML页面,少用脚本。21.除非脚本可以缓存,否则每次调用都会重新编译。引入PHP缓存机制通常可以将性能提高25%到100%,消除编译开销。22.尽量做缓存,可以用memcached。memcached是一个高性能的内存对象缓存系统,可用于加速动态web应用程序和减少数据库负载。用于缓存OP代码,这样脚本就不必为每个请求重新编译。23、当操作一个字符串,需要检查它的长度是否满足一定的要求时,理所当然的会用到strlen()函数。这个函数执行得相当快,因为??它不做任何计算,只返回存储在zval结构(C的内置数据结构,用于存储PHP变量)中的字符串的已知长度。但是,由于strlen()是一个函数,所以会有些慢,因为函数调用会经过很多步骤,比如小写字母(译注:指小写的函数名,PHP不区分函数的大小写names),散列查找,将与被调用的函数一起执行。在某些情况下,您可以使用isset()技巧来加速代码的执行。24、在执行变量$i的自增或自减时,$i++会比++$i慢。这种差异是PHP特有的,不适用于其他语言,所以请不要修改您的C或Java代码并期望它们立即变得更快,这是行不通的。++$i更快,因为它只需要3条指令(操作码),$i++需要4条指令。后递增实际上产生一个临时变量,然后递增。另一方面,预增量直接增加原始值。这是一种优化,由Zend的PHP优化器完成。记住这种优化是个好主意,因为并非所有指令优化器都进行相同的优化,而且有很多互联网服务提供商(ISP)和服务器没有配备指令优化器。25.不一定要面向对象(OOP)。面向对象往往代价高昂,每次方法和对象调用都会消耗大量内存。26.不一定要用类来实现所有的数据结构,数组也很有用。27.尽量使用大量的PHP内置函数。28、如果代码中有很多耗时函数,可以考虑用C扩展实现。29.剖析你的代码。检查器会告诉您代码的哪些部分消耗了多少时间。Xdebug调试器包含检查程序,评估检查可以大体显示代码的瓶颈。30.mod_zip可以用作Apache模块来立即压缩您的数据并减少80%的数据传输。31、当可以用file_get_contents代替file、fopen、feof、fgets等系列方法时,尽量使用file_get_contents,因为它的效率要高很多!但是打开URL文件时要注意file_get_contents的PHP版本;32、文件操作尽量少,虽然PHP的文件操作效率不低;33、优化SelectSQL语句,尽可能少的执行Insert和Update操作(update的时候被骂得很惨);34、不要在循环内部声明变量,尤其是大变量:objects(这在PHP中似乎不是应该注意的问题吧?);35、多维数组中尽量不要赋值嵌套循环;36、PHP内部可以使用字符串操作的函数,不要使用正则表达式;37、foreach效率更高,尽量用foreach代替while和for循环;38.用单引号代替双引号来引用字符串;39、《用i+=1代替i=i+1,符合c/c++的习惯,效率还是很高的》;40、对于全局变量,unset()要用完;