|
優(yōu)化php效率,提高php性能的一些方法 1、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用 file_get_contents,因?yàn)樗男矢叩枚唷且⒁鈌ile_get_contents在打開(kāi)一個(gè)URL文件時(shí)候的PHP版本問(wèn)題; 2、盡量的少進(jìn)行文件操作,雖然PHP的文件操作效率也不低的; 3、優(yōu)化Select SQL語(yǔ)句,在可能的情況下盡量少的進(jìn)行Insert、Update操作(在update上,我被惡批過(guò)); 4、盡可能的使用PHP內(nèi)部函數(shù)(但是我卻為了找個(gè)PHP里面不存在的函數(shù),浪費(fèi)了本可以寫(xiě)出一個(gè)自定義函數(shù)的時(shí)間,經(jīng)驗(yàn)問(wèn)題啊~); 5、循環(huán)內(nèi)部不要聲明變量,尤其是大變量:對(duì)象(這好像不只是PHP里面要注意的問(wèn)題吧,); 6、多維數(shù)組盡量不要循環(huán)嵌套賦值; 7、在可以用PHP內(nèi)部字符串操作函數(shù)的情況下,不要用正則表達(dá)式; 8、foreach效率更高,盡量用foreach代替while和for循環(huán); 9、用單引號(hào)替代雙引號(hào)引用字符串; 10、“用i+=1代替i=i+1。符合c/c++的習(xí)慣,效率還高”; 11、對(duì)global變量,應(yīng)該用完就unset()掉; 12、在for或者foreach中,用 $tempArray[] = $field代替$tempArray[count($tempArray)] = $field 13、靜態(tài)調(diào)用的成員一定要定義成 static (PHP5 ONLY) 貼士:PHP 5 引入了靜態(tài)成員的概念,作用和 PHP 4 的函數(shù)內(nèi)部靜態(tài)變量一致,但前者是作為類的成員來(lái)使用。靜態(tài)變量和 Ruby 的類變量(class variable)差不多,所有類的實(shí)例共享同一個(gè)靜態(tài)變量。 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php class foo { function bar() { echo 'foobar'; } } $foo = new foo; // instance way $foo- bar(); // static way foo::bar(); ?> 靜態(tài)地調(diào)用非 static 成員,效率會(huì)比靜態(tài)地調(diào)用 static 成員慢 50-60%。主要是因?yàn)榍罢邥?huì)產(chǎn)生 E_STRICT 警告,內(nèi)部也需要做轉(zhuǎn)換。 使用類常量 (PHP5 ONLY) 貼士:PHP 5 新功能,類似于 C++ 的 const。 使用類常量的好處是: - 編譯時(shí)解析,沒(méi)有額外開(kāi)銷 - 雜湊表更小,所以內(nèi)部查找更快 類常量?jī)H存在于特定「命名空間」,所以雜湊名更短 - - 代碼更干凈,使除錯(cuò)更方便 (暫時(shí))不要使用 require/include_once require/include_once 每次被調(diào)用的時(shí)候都會(huì)打開(kāi)目標(biāo)文件~ - 如果用絕對(duì)路徑的話,PHP 5.2/6.0 不存在這個(gè)問(wèn)題 - 新版的 APC 緩存系統(tǒng)已經(jīng)解決這個(gè)問(wèn)題文件 I/O 增加 = 效率降低 如果需要,可以自行檢查文件是否已被 require/include。 不要調(diào)用毫無(wú)意義的函數(shù)有對(duì)應(yīng)的常量的時(shí)候,不要使用函數(shù)。 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php php_uname('s') == PHP_OS; php_version() == PHP_VERSION; php_sapi_name() == PHP_SAPI; ?> 雖然使用不多,但是效率提升大概在 3500% 左右。 最快的 Win32 檢查 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php $is_win = DIRECTORY_SEPARATOR == ''; ?> 時(shí)間問(wèn)題 (PHP 5.1.0 ONLY) 用系統(tǒng)變量$_SERVER['REQUEST_TIME'],代替系統(tǒng)函數(shù)time() 加速 PCRE 這樣 PHP 不用為符合的內(nèi)容分配內(nèi)存,省。效率提升 15% 左右。 - 能不用正則,就不用正則,在分析的時(shí)候仔細(xì)閱讀手冊(cè)「字符串函數(shù)」部分。有沒(méi)有你漏掉的好用的函數(shù), 例如: strpbrk() strncasecmp() strpos()/strrpos()/stripos()/strripos() 加速 strtr 如果需要轉(zhuǎn)換的全是單個(gè)字符的時(shí)候,用字符串而不是數(shù)組來(lái)做 strtr: QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php $addr = strtr($addr, "abcd", "efgh"); // good $addr = strtr($addr, array('a' = 'e', // ... )); // bad ?> 效率提升:10 倍。 不要做無(wú)謂的替換 即使沒(méi)有替換,str_replace 也會(huì)為其參數(shù)分配內(nèi)存。很慢~解決辦法: - 用 strpos 先查找(非常快),看是否需要替換,如果需要,再替換 效率: 如果需要替換:效率幾乎相等,差別在 0.1% 左右。 - - 如果不需要替換:用 strpos 快 200%。 邪惡的 @ 操作符 不要濫用 @ 操作符。雖然 @ 看上去很簡(jiǎn)單,但是實(shí)際上后臺(tái)有很多操作。用 @ 比起不用 @,效率差距:3 倍。 特別不要在循環(huán)中使用 @,在 5 次循環(huán)的測(cè)試中,即使是先用 error_reporting(0) 關(guān)掉錯(cuò)誤,在循環(huán)完成后再打開(kāi),都比用 @ 快。 善用 strncmp 當(dāng)需要對(duì)比「前 n 個(gè)字符」是否一樣的時(shí)候,用 strncmp/strncasecmp,而不是 substr/strtolower,更不是 PCRE,更千萬(wàn)別提 ereg。 strncmp/strncasecmp 效率最高(雖然高得不多)。 慎用 substr_compare (PHP5 ONLY) 按照上面的道理,substr_compare 應(yīng)該比先 substr 再比較快咯。答案是否定的,除非: - 無(wú)視大小寫(xiě)的比較 - 比較較大的字符串 不要用常量代替字符串為什么: - 需要查詢雜湊表兩次 - 需要把常量名轉(zhuǎn)換為小寫(xiě)(進(jìn)行第二次查詢的時(shí)候) - 生成 E_NOTICE 警告 - 會(huì)建立臨時(shí)字符串 效率差別:700%。 不要把 count/strlen/sizeof 放到 for 循環(huán)的條件語(yǔ)句中 貼士:我的個(gè)人做法 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php for ($i = 0, $max = count($array);$i $max; ++$i); ?> 效率提升相對(duì)于: - count 50% - strlen 75% 短的代碼不一定快 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php // longest if ($a == $b) { $str .= $a; } else { $str .= $b; } // longer if ($a == $b) { $str .= $a; } $str .= $b; // short $str .= ($a == $b ? $a : $b); ?> 你覺(jué)得哪個(gè)快, 效率比較: - longest: 4.27 - longer: 4.43 - short: 4.76 不可思議,再來(lái)一個(gè): QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php // original $d = dir('.'); while (($entry = $d- read()) !== false) { if ($entry == '.' || $entry == '..') { continue; } } // versus glob('./*'); // versus (include . and ..) scandir('.'); ?> 哪個(gè)快, 效率比較: - original: 3.37 - glob: 6.28 - scandir: 3.42 - original without OO: 3.14 - SPL (PHP5): 3.95 畫(huà)外音:從此也可以看出來(lái) PHP5 的面向?qū)ο笮侍岣吡撕芏?,效率已?jīng)和純 函數(shù)差得不太多了。 提高 PHP 文件訪問(wèn)效率 需要包含其他 PHP 文件的時(shí)候,使用完整路徑,或者容易轉(zhuǎn)換的相對(duì)路徑。 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php include 'file.php'; // bad approach incldue './file.php'; // good include '/path/to/file.php'; // ideal ?> 物盡其用 PHP 有很多擴(kuò)展和函數(shù)可用,在實(shí)現(xiàn)一個(gè)功能的之前,應(yīng)該看看 PHP 是否有了這個(gè)功能,是否有更簡(jiǎn)單的實(shí)現(xiàn), QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php $filename = "./somepic.gif"; $handle = fopen($filename, "rb"); $contents = fread($handle, filesize($filename)); fclose($handle); // vs. much simpler file_get_contents('./somepic.gif'); ?> 關(guān)于引用的技巧 引用可以: - 簡(jiǎn)化對(duì)復(fù)雜結(jié)構(gòu)數(shù)據(jù)的訪問(wèn) - 優(yōu)化內(nèi)存使用 QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 <?php $a['b']['c'] = array(); // slow 2 extra hash lookups per access for ($i = 0; $i ++$i) $a['b']['c'][$i] = $i; // much faster reference based approach $ref =& $a['b']['c']; for ($i = 0; $i ++$i) $ref[$i] = $i; ?> QUOTE: 復(fù)制代碼 代碼如下: // PHP CODE Highliting for CU by dZ902 ?php $a = 'large string'; // memory intensive approach function a($str) { return $str.'something'; } // more efficient solution function a(&$str) { $str .= 'something'; } ?>
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|