PHP程序优化总结.docx
- 文档编号:30550078
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:16
- 大小:23.21KB
PHP程序优化总结.docx
《PHP程序优化总结.docx》由会员分享,可在线阅读,更多相关《PHP程序优化总结.docx(16页珍藏版)》请在冰豆网上搜索。
PHP程序优化总结
PHP优化
1、in_array的用法
避免在大的数组上使用in_array(),同时避免在循环中对包含20个以上元素的数组使用这个函数。
in_array()会非常消耗资源.对于小的数组这种影响可能很小,但是在一个循环中检查大数组可能会需要好几秒钟的时间。
如果您确实需要这个功能,请使用isset()来查找数组元素。
实际上是使用键名来查询键值。
调用isset($array[$var])会比in_array($var,array_keys($array))要快得多。
2、数组键名
在PHP中,使用不经单引号包含的字符串作为数组键名是合法的,但是我们不希望如此--键名应该总是由单引号包含而避免引起混淆。
注意这是使用一个字符串,而不是使用变量做键名的情况。
例如:
//不好的写法
$foo=$assoc_array[blah];
//好的写法
$foo=$assoc_array['blah'];
//不好的写法
$foo=$assoc_array["$var"];
//好的写法
$foo=$assoc_array[$var];
3、字符串表达
在PHP中用两种不同的方式来表示一个字符串-单引号或者双引号。
主要的区别在于语法解释器会对双引号表示的字符串进行变量替换,而不会处理单引号表示的字符串。
因此您应该总是使用单引号,除非您真的需要在字符串中处理变量。
这样,我们可以减少程序运行消耗,因为语法解释器不需要每次多处理一大堆根本没有变量的字符串。
同样,如果您在函数调用中使用了一个字符串变量作为参数,您不需要将这个变量包含在引号里。
这会导致语法解释器多做好多无用功。
记住,几乎所有双引号中的转义符对于单引号都是无效的。
您需要留意以上的规则,但是有时候为了代码的可读性,可以适当的破例。
例如:
//不好的写法
$str="Thisisareallylongstringwithnovariablesfortheparsertofind.";
do_stuff("$str");
//好的写法
$str='Thisisareallylongstringwithnovariablesfortheparsertofind.';
do_stuff($str);
//有时候单引号不是那么合适
$post_url=$phpbb_root_path.'posting.'.$phpEx.'?
mode='.$mode.'&start='.$start;
//双引号有时候能让代码行更集中
$post_url="{$phpbb_root_path}posting.$phpEx?
mode=$mode&start=$start";
4、循环定义中的操作
在比较部分如果存在运算请一定要进行优化。
因为这部分会在循环中的每一步进行操作:
//在每次循环中sizeof函数都要被调用
for($i=0;$i { do_something(); } //您可以在循环起始部分对这个不变的量赋值 for($i=0,$size=sizeof($post_data);$i<$size;$i++) { do_something(); } 5、分支判断,switchcase好于ifelse 使用分支语句要比用很多ifelse好很多。 6、不要滥用@操作符 不要滥用@操作符,看上去很简单,但实际上用@比不用@效率要差几倍。 特别不要在循环中使用@。 7、获取时间的方法 很多时候我们习惯使用time()获取当前时间,但time()终归是一个函数,不如直接用$_SERVER['REQUEST_TIME']好一点。 8、字符串长度判断 两种写法: (1)if(strlen($str)<5){/*dosomething*/} (2)if(isset($str[5])){/*dosomething*/} 第二种写法要优于第一种。 向PHP要效率——加快你的代码执行速度 脚本语言效率都是低下的,PHP也不例外。 而效率的高低实际上,都是在你的每一行代码中节省或浪费的。 所以,这里向你讲解一些基本的效率常识,让你的代码执行速度快起来。 (注: 看过N多版本的优化PHP代码的建议,觉得不系统,也不全面,这里只是给出平常极需要注意的一些。 ) 一、字符串问题 1、字符中拼接大于数组的implode,也快于sprintf 你可以执行一下下面的代码: Php代码 /** *SimplefunctiontoreplicatePHP5behaviour */ functionmicrotime_float() { list($usec,$sec)=explode("",microtime()); return((float)$usec+(float)$sec); } $start=microtime_float(); //standardstringappend $str=''; for($i=300000;$i>0;$i--){ $str.='Stringconcatenation.'; } $end=microtime_float(); echo(" time: ".round($end-$start,2)." "); $start=microtime_float(); //arrayjoin $str=''; $sArr=array(); for($i=300000;$i>0;$i--){ $sArr[]='Stringconcatenation.'; } $str=implode('',$sArr); $end=microtime_float(); echo(" time: ".round($end-$start,2)." "); ? > 复制代码 我机器的输出结果是: time: 0.14 time: 0.25 2、字符串替换 同时,如果不能拼接,才考虑替换。 而替换方式,要按以下的优先方式考虑写代码: sprintf快于str_replace快于preg_replace快于strstr 3、字符串查找,字符串比较: 网上有人测试的结果是: Results ereg.956 preg_match.050 strstr.222 strpos.033 可见: strpos快于preg_match快于strstr快于ereg 有人说,strstr快,但,preg_match_all肯定比for循环中的strstr快,如果能够explode,则还要比preg_match_all快 3、字符串输出: echo快于print,这不用讲了。 但是,如果将echo用到最快? $foo='JohnSMITH'; echo"Hello$foo,welcomeonmyblog."; echo"Hello".$foo."welcomeonmyblog."; echo'Hello'.$foo.'welcomeonmyblog.'; echo'Hello',$foo,'welcomeonmyblog.'; 复制代码 我想,你能看得懂的,最后一个最快。 二、数组问题: foreach快于for这是大家都明白的。 不仅如此。 如果真的用for,你这样写是最好的 for($i=0,$j=count($array);$i<$j;$i++){ } 前面说了,数组用来做字串拼接,会慢,因为,你走了两循环。 但很多操作,如果能用数组协助完成,则会很快。 比如: array_mar('trim',$array)肯定比你写for,foreach要快很多。 能先用explode拆成数组,最好不要在for循环中使用strpos. in_array函数的效率问题。 如果in_array频繁使用,而数组很大,建议将这个数组排序,然后,用fast_in_array 这是PHP手册中的用户添加的函数。 (注: 有待测试结果,小数组,in_array还是快于它) Thisfunctionisfivetimesfasterthanin_array().Itusesabinarysearchandshouldbeabletobeusedasadirectreplacement: Php代码 functionfast_in_array($elem,$array) { $top=count($array)-1; $bot=0; while($top>=$bot) { $p=floor(($top+$bot)/2); if($array[$p]<$elem)$bot=$p+1; elseif($array[$p]>$elem)$top=$p-1; elsereturnTRUE; } returnFALSE; } ? > 复制代码 用数组改变你的所有能改变的控制结构。 这不仅包括三元运算符,还有: if,switch。 这还有另一好处,那就是能培养你的软编码模式的思维。 Insteadof $class=$class=='even'? 'odd': 'even' wehave $flip=array('even'=>'odd','odd'=>'even'); $class=$flip[$class]; 三、函数问题 使用正名函数,不要用函数的别名。 别名在PHP中是用于PHP的推广(比如split,join是VB中有的函数,implode,explode则是正名函数),或用于向旧版本兼容。 一般速度没有正名的快。 count快于sizeof is_integer快于is_int floatval快于doubleval implode快于join ini_set快于ini_alter 当然,也有极个别的例外,比如: fputs快于fwrite,我觉得,可以不管它。 PHP效率优化 链接来源: 时间: 2009-03-18点击: 66 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很重要,这里就结合网上的一些资料,总结下php程序效率优化的一些策略: 1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多! 但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题; 2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的; 3.优化SelectSQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过); 4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊! ); 5.循环内部不要声明变量,尤其是大变量: 对象(这好像不只是PHP里面要注意的问题吧? ); 6.多维数组尽量不要循环嵌套赋值; 7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式; 8.foreach效率更高,尽量用foreach代替while和for循环; 9.用单引号替代双引号引用字符串; 10.“用i+=1代替i=i+1。 符合c/c++的习惯,效率还高”; 11.对global变量,应该用完就unset()掉; 以上的策略所涉及的问题,我都在实践中遇到过,用了这些策略,效率提高了不少。 试试吧。 。 。 。 以下是一篇关于提高PHP效率的文章,很不错啦: =================================================================================== 榨干php,提高效率 2006-12-2214: 35 原文地址: [url=thread-13409-1-1.html] 这篇杂文翻译整理自网络各路文档资料(见最末的参考资料),尤其是IliaAlshanetsky(佩服之至)在多个php会议上的演讲,主要是各类提高php性能的技巧。 为求精准,很多部分都有详细的效率数据,以及对应的版本等等。 偷懒,数据就不一一给出了,直接给结论,如果需要看原文档,请到文末「参考资料」部分。 橙色标题为推荐部分。 ======================================================== 静态调用的成员一定要定义成static(PHP5ONLY) 贴士: PHP5引入了静态成员的概念,作用和php4的函数内部静态变量一致,但前者是作为类的成员来使用。 静态变量和Ruby的类变量(classvariable)差不多,所有类的实例共享同一个静态变量。 QUOTE: //phpCODEHighlitingforCUbydZ902 php classfoo{ functionbar(){ echo'foobar'; } } $foo=newfoo; //instanceway $foo->bar(); //staticway foo: : bar(); ? > 静态地调用非static成员,效率会比静态地调用static成员慢50-60%。 主要是因为前者会产生E_STRICT警告,内部也需要做转换。 使用类常量(PHP5ONLY) 贴士: PHP5新功能,类似于C++的const。 使用类常量的好处是: -编译时解析,没有额外开销 -杂凑表更小,所以内部查找更快 -类常量仅存在于特定「命名空间」,所以杂凑名更短 -代码更干净,使除错更方便 (暂时)不要使用require/include_once require/include_once每次被调用的时候都会打开目标文件! -如果用绝对路径的话,PHP5.2/6.0不存在这个问题 -新版的APC缓存系统已经解决这个问题 文件I/O增加=>效率降低 如果需要,可以自行检查文件是否已被require/include。 不要调用毫无意义的函数 有对应的常量的时候,不要使用函数。 QUOTE: //phpCODEHighlitingforCUbydZ902 php php_uname('s')==PHP_OS; php_version()==PHP_VERSION; php_sapi_name()==PHP_SAPI; ? > 虽然使用不多,但是效率提升大概在3500%左右。 最快的Win32检查 QUOTE: //phpCODEHighlitingforCUbydZ902 php $is_win=DIRECTORY_SEPARATOR=='\\'; ? > -不用函数 -Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...通用 -一直可用 时间问题(PHP>5.1.0ONLY) 你如何在你的软件中得知现在的时间? 简单,「time()time()again,youaskme...」。 不过总归会调用函数,慢。 现在好了,用$_SERVER['REQUEST_TIME'],不用调用函数,又省了。 加速PCRE -对于不用保存的结果,不用(),一律用(? [点击图片可在新窗口打开] 这样php不用为符合的内容分配内存,省。 效率提升15%左右。 -能不用正则,就不用正则,在分析的时候仔细阅读手册「字符串函数」部分。 有没有你漏掉的好用的函数? 例如: strpbrk() strncasecmp() strpos()/strrpos()/stripos()/strripos() 加速strtr 如果需要转换的全是单个字符的时候,用字符串而不是数组来做strtr: QUOTE: //phpCODEHighlitingforCUbydZ902 php $addr=strtr($addr,"abcd","efgh");//good $addr=strtr($addr,array('a'=>'e', //... ));//bad ? > 效率提升: 10倍。 不要做无谓的替换 即使没有替换,str_replace也会为其参数分配内存。 很慢! 解决办法: -用strpos先查找(非常快),看是否需要替换,如果需要,再替换 效率: -如果需要替换: 效率几乎相等,差别在0.1%左右。 -如果不需要替换: 用strpos快200%。 邪恶的@操作符 不要滥用@操作符。 虽然@看上去很简单,但是实际上后台有很多操作。 用@比起不用@,效率差距: 3倍。 特别不要在循环中使用@,在5次循环的测试中,即使是先用error_reporting(0)关掉错误,在循环完成后再打开,都比用@快。 善用strncmp 当需要对比「前n个字符」是否一样的时候,用strncmp/strncasecmp,而不是substr/strtolower,更不是PCRE,更千万别提ereg。 strncmp/strncasecmp效率最高(虽然高得不多)。 慎用substr_compare(PHP5ONLY) 按照上面的道理,substr_compare应该比先substr再比较快咯。 答案是否定的,除非: -无视大小写的比较 -比较较大的字符串 不要用常量代替字符串 为什么: -需要查询杂凑表两次 -需要把常量名转换为小写(进行第二次查询的时候) -生成E_NOTICE警告 -会建立临时字符串 效率差别: 700%。 不要把count/strlen/sizeof放到for循环的条件语句中 贴士: 我的个人做法 QUOTE: //phpCODEHighlitingforCUbydZ902 php for($i=0,$max=count($array);$i<$max;++$i); ? > 效率提升相对于: -count50% -strlen75% 短的代码不一定快 QUOTE: //phpCODEHighlitingforCUbydZ902 php //longest if($a==$b){ $str.=$a; }else{ $str.=$b; } //longer if($a==$b){ $str.=$a; } $str.=$b; //short $str.=($a==$b? $a: $b); ? > 你觉得哪个快? 效率比较: -longest: 4.27 -longer: 4.43 -short: 4.76 不可思议? 再来一个: QUOTE: //phpCODEHighlitingforCUbydZ902 php //original $d=dir('.'); while(($entry=$d->read())! ==false){ if($entry=='.'||$entry=='..'){ continue; } } //versus glob('./*'); //versus(include.and..) scandir('.'); ? > 哪个快? 效率比较: -original: 3.37 -glob: 6.28 -scandir: 3.42 -originalwithoutOO: 3.14 -SPL(PHP5): 3.95 画外音: 从此也可以看出来PHP5的面向对象效率提高了很多,效率已经和纯函数差得不太多了。 提高php文件访问效率 需要包含其他php文件的时候,使用完整路径,或者容易转换的相对路径。 QUOTE: //phpCODEHighlitingforCUbydZ902 php include'file.php';//badapproach incldue'./file.php';//good include'/path/to/file.php';//ideal ? > 物尽其用 php有很多扩展和函数可用,在实现一个功能的之前,应该看看php是否有了这个功能? 是否有更简单的实现? QUOTE: //phpCODEHighlitingforCUbydZ902 php $filename="./somepic.gif"; $handle=fopen($filename,"rb"); $contents=fread($handle,filesize($filename)); fclose($handle); //vs.muchsimpler file_get_contents('./somepic.gif'); ? > 关于引用的技巧 引用可以: -简化对复杂结构数据的访问 -优化内存使用 QUOTE: //phpCODEHighlitingforCUbydZ902 php $a['b']['c']=array(); //slow2extrahashlookupsperaccess for($i=0;$i<5;++$i) $a[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 程序 优化 总结