在项目开发过程中,经常遇到一些PHP处理程序性能低下的情况。程序运行在centos+nginx环境下,虽然有很多原因,比如:服务器本身的配置,运行环境的nginx服务,php-fpm的配置等。还有一点就是PHPer没有更好地优化程序。第一类,变量类型:1)主要使用未定义的变量,而是直接使用变量。在程序开发的最后,程序员喜欢把debug关掉,这样所有的Notices和Warnings都被隐藏起来,但本质上,php即使关掉debug也会记录日志,把所有的Notice和Warning信息写入日志文件也没什么不仅仅是浪费性能。很多phper都有这个小习惯,包括我。2)另外,尽量注意程序中变量的使用。例如,字符串最好使用单引号而不是双引号。毕竟双引号在执行前还得被PHP解析成单引号。3)说到这里,数组中的key-value索引也需要使用单引号。不要写没有引号的引号。程序执行效率极低。第二类,函数型:1)SESSION变量,大家都知道调用全局变量SESSION,往往你把值赋值给SESSION后,直接继续写自己的代码,却忘了SESSION变量会在页面上执行完成后会将值放入SESSION中供其他页面使用,所以如果这个页面执行时间过长,其他页面也会调用这个SESSION等待写入SESSION的页面执行完成,后面再执行其他程序,但是我们的程序不想要这样的效果,因为我们只需要在执行完之后把值写入SESSION,然后放到SESSION中,而不是等待页面执行完.从PHP官网也可以看到,SESSION变量确实存在这个问题,所以我们需要在写完SESSION后关闭写SESSION操作,添加session_write_close()函数可以减少等待页面的无用时间加载。2)file_get_contents()函数,这个函数的意思是获取远程URL的页面内容,但是虽然是这样写的,但是很多人不会注意“超时”这样的问题,如果获取不到页面内容,程序会一直卡在这里,很多人会联系设置页面超时时间或者在php.ini中设置max_execution_time最大执行超时时间。在php-fpm的配置文件中设置了最大执行超时时间,最终还是不行。要解决这个问题,我们还是需要在调用这个函数的时候加上一个超时时间,从根本上解决问题。第三类,参考文件类:参考文件是我们经常使用的习惯,但是这中间也有一些隐藏的技巧。如果你经常使用该框架开发程序,你就会熟悉它。project类型的文件夹下会有“include”,程序查找包含文件的顺序是先到当前工作目录根路径下的include文件夹中查找,再到相对于当前工作目录的include文件夹中查找文件所在的目录,也就是如果这个include使用不当,程序会这样在根路径下依次查找,这也是一件很费解的事情,所以你应该尽量把你用到的文件写在最容易找到的地方,这样有利于程序的执行效率。另外还有像echo这样输出多个字符串或变量的函数,用“.”连接的效率比用“,”连接要低。更详细具体总结如下:1.使用单引号代替双引号来包含字符串,这样会更快。因为PHP会在双引号包围的字符串中搜索变量,单引号不会,注意:只有echo可以这样做,它是一个可以接受多个字符串作为参数的“函数”(译注:PHP手册中说echo是一种语言结构,不是真正的函数,所以在函数中加了双引号)。2、如果能把类的方法定义为static,尽量定义为static,其速度会提高近4倍。3.$row['id']比$row[id]快7倍。4.echo比print快,而且使用echo的多个参数代替字符串拼接,如echo$str1,$str2。5.在执行for循环之前确定最大循环次数。不要每次循环都计算最大值。最好改用foreach。6.注销那些不用的变量,尤其是大数组,以释放内存。7、尽量避免使用__get、__set、__autoload。8.require_once()很昂贵。9、include文件时尽量使用绝对路径,因为这样避免了PHP在include_path中查找文件的速度,解析操作系统路径的时间会少一些。10、如果想知道脚本开始执行的时刻(译注:即服务器收到客户端请求),最好用$_SERVER['REQUEST_TIME'],而不是time()。11、函数代替正则表达式完成相同的功能。12、str_replace函数比preg_replace函数快,但是strtr函数比str_replace函数效率高四倍。13、如果一个字符串替换函数接受数组或者字符作为参数,并且参数的长度不是太长,那么可以考虑多写一个替换代码,这样每次参数都作为字符传递,而不是只写一行代码接受数组作为参数进行查询和替换。14、使用替代分支语句(译注:即switchcase)比使用多个if、elseif语句要好。15、使用@来屏蔽错误信息的做法效率很低,效率极低。16、打开apache的mod_deflate模块,可以提高网页的浏览速度。17、数据库连接用完要关闭,不要使用长连接。18.错误信息是昂贵的。19.在方法中自增局部变量是最快的。几乎与在函数中调用局部变量一样快。20.递增全局变量比递增局部变量慢2倍。21.递增一个对象属性(例如:$this->prop++)比递增一个局部变量慢3倍。22.递增一个未定义的局部变量比递增一个预定义的局部变量慢9到10倍。23.只定义一个局部变量而不在函数中调用它也会减慢速度(程度相当于自增一个局部变量)。PHP可能会检查全局变量是否存在。24.方法调用好像和类中定义的方法个数没有关系,因为我加了10个方法(测试方法前后都有),性能没有变化。25.派生类中的方法比基类中定义的相同方法运行得更快。26.调用一个带参数的空函数只要7到8个局部变量增量。类似的方法调用需要将近15个局部变量增量。27.Apache解析PHP脚本比解析静态HTML页面慢2到10倍。尽量使用静态HTML页面,少用脚本。28.除非脚本可以缓存,否则每次调用都会重新编译。引入PHP缓存机制通常可以将性能提高25%到100%,消除编译开销。29.尽量做缓存,可以用memcached。memcached是一个高性能的内存对象缓存系统,可用于加速动态web应用程序和减少数据库负载。用于缓存OP代码,这样脚本就不必为每个请求重新编译。30、当操作一个字符串,需要检查其长度是否满足一定的要求时,当然会用到strlen()函数。这个函数非常快,因为它不做任何计算,只返回存储在zval结构(C的内置数据结构,用于存储PHP变量)中的字符串的已知长度。但是,由于strlen()是一个函数,所以会有些慢,因为函数调用会经过很多步骤,比如小写字母(译注:指小写的函数名,PHP不区分函数的大小写names),散列查找,将与被调用的函数一起执行。在某些情况下,您可以使用isset()技巧来加速代码的执行。(下面的示例)if(strlen($foo)<5){echo“Fooistooshort”$$}(与下面的技术比较)if(!isset($foo{5})){echo“Fooistooshort”$$}调用isset()恰好比strlen()快,因为与后者不同,isset()是一种语言结构,这意味着它的执行不需要函数查找和字母小写。也就是说,您实际上并没有在检查字符串长度的顶级代码中花费太多开销。31、在执行变量$i的自增或自减时,$i++会比++$i慢。这种差异是PHP特有的,不适用于其他语言,所以请不要修改您的C或Java代码并期望它们立即变得更快,这是行不通的。++$i更快,因为它只需要3条指令(操作码),$i++需要4条指令。后递增实际上产生一个临时变量,然后递增。另一方面,预增量直接增加原始值。这是一种优化,由Zend的PHP优化器完成。记住这种优化是个好主意,因为并非所有指令优化器都进行相同的优化,而且有很多互联网服务提供商(ISP)和服务器没有配备指令优化器。32.不一定要面向对象(OOP)。面向对象往往代价高昂,每次方法和对象调用都会消耗大量内存。33.不一定要用类来实现所有的数据结构,数组也很有用。34、方法不要细分太多,仔细想想你真正打算复用的代码是什么?35.当你需要的时候,你总是可以把代码分解成方法。36.尽量使用大量的PHP内置函数。37、如果代码中有很多耗时函数,可以考虑用C扩展实现。38.剖析你的代码。检查器会告诉您代码的哪些部分消耗了多少时间。Xdebug调试器包含检查程序,评估检查可以大体显示代码的瓶颈。39.mod_zip可以用作Apache模块来立即压缩您的数据并减少80%的数据传输。40、当可以使用file_get_contents代替file、fopen、feof、fgets等系列方法时,尽量使用file_get_contents,因为它的效率要高很多!但是打开一个URL文件时要注意file_get_contents的PHP版本。41、文件操作尽量少做,虽然PHP的文件操作效率不低。42.优化SelectSQL语句,尽量少执行Insert和Update操作(我在update上被骂得很惨)。43.尽可能使用PHP内部函数(但我浪费了我本可以写自定义函数的时间,以便找到PHP中不存在的函数,经验是个问题!)。44、不要在循环内部声明变量,尤其是大变量:objects(这似乎不只是PHP需要注意的问题?)。45.尽量不要对多维数组进行循环嵌套赋值。46、可以使用PHP内部的字符串操作函数时,不要使用正则表达式。47.foreach效率更高,尽量用foreach代替while和for循环。48.用单引号代替双引号来引用字符串。49.用i+=1代替i=i+1。符合c/c++的习惯,效率高。50、对于全局变量,unset()要用完。以上就是一些最基本的程序优化问题。希望以后少犯这样的错误。
