1.少用正则表达式对字符串如果可以使用PHP内部的字符串操作函数,尽量用它们代替正则表达式,因为它们的效率比正则表达式高。不用说,正则化消耗的性能最多。str_replace函数比preg_replace快很多,strtr函数比str_replace快。您是否错过了一个有用的功能?例如:strpbrk()、strncasecmp()、strpos()、strrpos()、stripos()、strripos()。字符替换如果所有需要转换的字符都是单个字符,使用字符串作为strtr()函数完成替换,而不是数组:$addr=strtr($addr,"abcd","efgh");//建议$addr=strtr($addr,array('a'=>'e',));//弃用效率提升:10倍。str_replace字符替换比常规替换preg_replace快,但strtr比str_replace快1/4。另外,不要做不必要的替换,即使没有替换,str_replace也会为其参数分配内存。非常慢!使用strpos首先查找(非常快)以查看是否需要替换,如果需要,则替换。如果需要更换,效率几乎相等,相差约0.1%。如果不需要更换:使用strpos时速度提高200%。压缩大字符串使用gzcompress()和gzuncompress()压缩和解压缩大容量字符串,然后从数据库中存储和检索它们。这个内置函数使用了gzip算法,可以将字符串压缩90%。echo用逗号而不是点来输出回显字符串更快。虽然,echo是一种语言结构,而不是真正的功能。但是,它可以将多个以逗号分隔的字符串作为“函数”参数传递,因此速度会更快。回显$str1,$str2;//快速回显$str1.$str2;//慢,尽量使用单引号PHP引擎允许使用单引号和双引号来包裹字符串变量,但是它们的速度相差很大!带双引号的字符串会告诉PHP引擎首先读取字符串的内容,找到其中的变量,并将其更改为变量对应的值。一般来说,字符串是没有变量的,使用双引号会导致性能不佳。最好使用字符串连接而不是双引号字符串。$output="这是一个普通字符串";//坏习惯$output='Thisisaplainstring';//好的做法$type="mixed";//坏习惯$output="Thisisa$typestring";$type='混合';//好的做法$output='Thisisa'.$类型。'细绳';使用isset而不是strlen在检查字符串的长度时,我们首先的想法是使用strlen()函数。这个函数执行得相当快,因为??它不做任何计算,只返回存储在zval结构(C的内置数据结构,用于存储PHP变量)中的字符串的已知长度。但是,由于strlen()是一个函数,或多或少会慢一些,因为函数调用会经过很多步骤,比如小写字母、哈希查找,并且会和被调用的函数一起执行。在某些情况下,您可以使用isset()技巧来加速代码的执行。示例:if(strlen($foo)<5){echo"Fooistooshort";}//使用isset()if(!isset($foo{5})){echo"Fooistooshort";}使用split拆分字符串拆分字符串时,split()比explode()更快。split()0.001813-0.002271秒(平均0.002042秒)explode()0.001678-0.003626秒(平均0.002652秒)echo比print更有效,因为echo没有返回值,而print返回一个整数。注意:当echo输出的字符串比较大时,不调整会严重影响性能。开启Apache的mod_deflate进行压缩,或者开启ob_start将内容放入缓冲区,可以改善性能问题。2、最好不要用@,用@来掩盖错误,这样会减慢脚本的运行速度,后台还有很多多余的操作。与不使用@相比,效率差距是3倍。特别是不要在循环中使用@。在5个循环的测试中,即使使用error_reporting(0)先关闭错误,循环完成后再打开,也比使用@更快。避免使用魔术方法。以__开头的函数被命名为魔法函数,它们在特定条件下被触发。这些神奇的函数包括:__construct()、__get()、__call()、__autoload()等。以__autoload()为例,如果类名不能和实际的磁盘文件匹配,就得做很多文件存在性判断。判断文件是否存在需要磁盘I/O操作。众所周知,磁盘I/O操作的效率是很低的,所以这就是autoload机制效率降低的原因。因此,在设计系统时,需要定义明确的类名到实际磁盘文件的映射机制。这条规则越简单明了,__autoload()机制的效率就越高。自动加载机制并非天生低效。只有滥用自动加载和设计不良的自动加载功能才会导致其效率降低。因此,是否尽可能避免使用__autoload等魔术方法值得商榷。不要在循环中使用函数,例如:for($x=0;$x,可以让代码更简洁。没有结束标签的纯PHP代码如果文件内容是纯PHP代码,最好去掉文件末尾的PHP结束标签?>。这可以防止在PHP结束标记后意外添加空格或换行符,这会导致PHP在脚本无意输出这些空格时开始输出它们。永远不要使用register_globals和magicquotes这是两个很老的特性,在当时(十年前)也许是个好办法,但现在好像不是这样了。旧版本的PHP安装时默认打开这两个功能,这可能会导致安全漏洞、编程错误和其他问题。比如只有当用户输入数据时才会创建变量等。这两个函数从PHP5.4.0开始就被废弃了,所以每个程序员都应该避免使用它们。如果你过去的程序使用了这两个函数,请尽快将它们移除。3.函数尽量使用PHP内部函数内置函数用C语言实现,并经过PHP官方优化,效率更高。使用绝对路径在include和require中尽量使用绝对路径。如果包含相对路径,PHP将遍历include_path来查找文件。使用绝对路径会避免此类问题,并且解析路径所需的时间会更少。包含文件尽量不要使用require_once和include_once来包含文件,它们有一个额外的判断文件是否被引用的过程,尽量不要使用。这个可以在考虑效率的基础上,改用require和include方法。鸟哥在他的博客中多次声明尽量不要使用require_once和include_once。该函数比调用只有一个参数且函数体为空的函数的类方法要快,花费的时间相当于7-8次$localvar++操作。一个具有相同功能的类方法大约需要15次$localvar++操作。使用子类方法基类中只能放置可重用的方法,其他功能尽量在子类中实现。子类中方法的性能优于基类中的方法。类的性能与其方法的数量无关。在测试类中添加10个或更多新方法后,性能没有差异。读取文件内容在可以使用file_get_contents()代替file()、fopen()、feof()、fgets()等系列方法的情况下,尽量使用file_get_contents()。因为他效率更高!传参使用参数地址引用实现函数的多个返回值,比传值效率更高。方法是在参数变量前加一个&。方法不要细分太多仔细想想你真正要复用的代码是什么?如果一个方法可以是static就尽量是static,然后声明为static,速度可以提高1/4,甚至我测试的时候也提高了将近三倍。当然,这个测试方法需要在10万级以上执行,效果才会明显。事实上,静态方法和非静态方法的效率的主要区别在于内存。静态方法在程序开始时产生内存,实例方法(非静态方法)在程序运行时产生内存。所以静态方法可以直接调用,而实例方法在调用前需要生成一个实例。静态的速度很快,但是多了会占内存。任何语言都在内存和磁盘上运行。至于是否面向对象,只是软件层的问题。底层是一样的,只是实现方式不同。静态内存是连续的,因为它是在程序一开始就产生的,而实例方法申请的是离散空间,当然不如静态方法快。静态方法总是调用同一块内存,缺点是不能自动销毁,但实例化可以销毁。用C扩展实现如果代码中有很多比较耗时的函数,可以考虑用C扩展实现。4、及时销毁变量变量数组、对象和GLOBAL变量在PHP中占用内存较多,这是PHP底层的zend引擎造成的。一般来说,PHP数组的内存利用率只有1/10。也就是说在C语言中一个100M内存的数组在PHP中需要1G。特别是在使用PHP作为后台服务器的系统中,经常会出现内存消耗过大的问题。使用$_SERVER变量如果需要获取脚本执行时间,$_SERVER['REQUSET_TIME']优于time()。一个是现成的,可以直接使用,一个是需要函数的结果。在方法中创建局部变量在类方法中创建局部变量是最快的,几乎与在方法中调用局部变量一样快。局部变量比全局变量更快,因为局部变量存储在堆栈中。当一个函数占用的栈空间不是很大时,这部分内存很可能会命中缓存,CPU访问的效率很高。相反,如果一个函数同时使用了全局变量和局部变量,当两个地址相差很大时,CPU缓存需要来回切换,效率会下降。局部变量而不是对象属性创建一个对象属性(类中的一个变量,例如:$this->prop++)比局部变量慢3倍。局部变量的早期声明创建一个未声明的局部变量比创建一个已定义的局部变量慢9-10倍。谨慎声明全局变量声明一个未被任何函数使用的全局变量也会降低性能。这与声明相同数量的局部变量相同,PHP可能会检查全局变量是否存在。用++$i递增当执行变量$i的递增或递减时,$i++将比++$i慢。这种差异是PHP特有的,不适用于其他语言,所以请不要修改您的C或Java代码并期望它们立即变得更快,这是行不通的。++$i更快,因为它只需要3条指令(操作码),$i++需要4条指令。后递增实际上产生一个临时变量,然后递增。另一方面,预增量直接增加原始值。这是一种优化,由Zend的PHP优化器完成。请记住,这种优化是个好主意,因为并非所有指令优化器都进行相同的优化。不要随便复制变量有时候为了让PHP代码更整洁,一些PHP新手(包括我)会把预定义的变量复制成一个名字更短的变量。事实上,这样做的结果是内存消耗成倍增加,只会让程序变慢。试想一下,在下面的例子中,如果用户恶意插入了512KB字节的文本,将会导致1MB的内存被消耗掉!//坏习惯$description=$_POST['description'];回声$描述;//好的做法echo$_POST['description'];不要在循环里面声明变量特别是大变量,好像不只是PHP在里面应该注意些什么呢?一定要初始化变量。这里的“初始化”指的是“声明”。当需要一个未初始化的变量时,PHP解释器会自动创建一个,但是依靠这个特性进行编程并不是一个好主意。这会使程序变得粗糙,或者使代码混乱。因为你需要找出这个变量是从哪里创建的。此外,递增未初始化的变量比初始化的变量慢。所以初始化变量是个好主意。5.数组使用字符串而不是数组作为参数。如果一个函数可以接受数组和简单字符作为参数,那么尽量使用字符作为参数。比如字符替换功能,如果参数列表不是太长,可以考虑多写一个替换代码。使每个传递的参数成为一个字符,而不是接受一个数组作为查找和替换参数。数组元素引用$row['id']比$row[id]快7倍。如果没有引号,比如$a[name],那么PHP会先检查是否有define定义的name常量。如果是,则使用此常量值作为数组键。如果不是,则查找其键为字符串“name”的数组元素。多了一个查找判断的过程,所以建议养成数组键名加引号的习惯。上面字符串部分提到,使用'比使用"更快。操作多维数组时尽量不要循环嵌套赋值,尽量使用foreach而不是while和for循环for循环,效率更高。6.架构压缩output在php.ini中开启gzip压缩:zlib.output_compression=Onzlib.output_compression_level=(level)level可以是1-9之间的一个数字,你可以设置不同的数字。几乎所有的浏览器都支持Gzip压缩这样,gzip可以减少80%的输出,付出的代价是cpu计算增加了10%左右,但是还是会赚钱,因为带宽减少了,页面加载会变快,如果你用apache,你也可以mod_gzip模块可以激活。静态页面Apache/Nginx解析一个PHP脚本,比解析一个静态HTML页面慢2到10倍。所以尽量让页面静态化,或者使用静态HTML页面。升级PHP到最新版本印象最简单的方法over的表现就是不断的升级和更新php的版本。使用PHP扩展一直被抱怨PHP内容太复杂。近年来,开发人员做出了相应的努力,去除了一些多余的功能。即便如此,可用库和其他扩展的数量仍然相当可观。一些开发人员甚至开始考虑实施他们自己的扩展。PHP缓存一般情况下,PHP脚本由PHP引擎编译执行,并转换为机器语言,也称为操作码。如果PHP脚本反复编译得到相同的结果,为什么不完全跳过编译过程呢?PHP加速器缓存编译后的机器码,让代码可以按需立即执行,无需经过繁琐的编译过程。对于PHP开发人员,目前有两种可用的缓存解决方案。一种是APC(AlternativePHPCache,可选的PHP缓存),它是一个开源的加速器,可以通过PEAR安装。另一个流行的最佳解决方案是OPCode,也就是操作代码缓存技术。您可以使用NoSQL缓存Memchached或Redis。这些都是高性能的分布式内存对象缓存系统,可以提高动态网络应用的性能,减轻数据库的负担。(OPcode)缓存也很有用,这样脚本就不必为每个请求重新编译。