当前位置: 首页 > 科技观察

解析提高PHP执行效率的50个技巧

时间:2023-03-21 14:24:44 科技观察

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()要用完。