優化PHP執行效率的40條技巧

1.如果一個方法能被靜態,那就聲明他爲靜態的,速度可提高1/4;

2.echo的效率高於print,因爲echo沒有返回值,print返回一個整型;

3.在循環之前設置循環的最大次數,而非在在循環中;

4.銷燬變量去釋放內存,特別是大的數組;

5.避免使用像__get, __set, __autoload等魔術方法;

6.requiere_once()比較耗資源;

7.在includes和requires中使用絕對路徑,這樣在分析路徑花的時間更少;

8.如果你需要得sexinsex到腳本執行時的時間,$_SERVER['REQUSET_TIME']優於time();

9.能使用字符處理函數的,儘量用他們,因爲效率高於正則;

10.str_replace字符替換比正則替換preg_replace快,但strtr比str_replace又快1/4;

11.如果一個函數既能接受數組又能接受簡單字符做爲參數,例如字符替換,並且參數列表不是太長,可以考慮多用一些簡潔的替換語句,一次只替換一個字符,而不是接受數組做爲查找和替換參數。大事化小,1+1>2;

12.用@掩蓋錯誤會降低腳本運行速度;

13.$row['id']比$row[id]速度快7倍,建議養成數組鍵加引號的習慣;

14.錯誤信息很有用;

15.在循環裏別用函數,例如For($x=0; $x < count($array); $x), count()函數在外面先計算;

16.在方法裏建立局部變量速度最快,97xxoo幾乎和在方法裏調用局部變量一樣快;

17.建立一個全局變量要比局部變量要慢2倍;

18.建立一個對象屬性(類裏面的變量)例如($this->prop++)比局部變量要慢3倍;

19.建立一個未聲明的局部變量要比一個初始化的局部變量慢9-10倍;

20.聲明一個未被任何一個函數使用過的全局變量也會使性能降低(和聲明相同數量的局部變量一樣),PHP可能去檢查這個全局變量是否存在;

21.方法的性能和在一個類裏面定義的方法的數目沒有關係,因爲我添加10個或多個方法到測試的類裏面(這些方法在測試方法的前後)後性能沒什麼差異;

22.在子類裏方法的性能優於在基類中;

23.只調用一個參數並且函數體爲空的函數運行花費的時間等於7-8次$localvar++運算,而一個類似的方法(類裏的函數)運行等於大約15次$localvar++運算;

24.Surrounding your string by ‘ instead of ” will make things interpret a little faster since php looks for variables inside “…” but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string.

25.當輸出字符串時用逗號代替點分割更快些。注意:這隻對echo起作用,這個函數能接受一些字符串作爲參數;

26.在apache服務器裏一個php腳本頁面比相應的HTML靜態頁面生成至少要多花2-10倍的時間,建議多用些靜態HTML頁面和少量的腳步;

27.除非你的安裝了緩存,不然你的php腳本每次被訪問都需要被重編譯。建議安裝個php緩存程序,這樣通過去除一些重複的編譯來很明顯的提高你20-100%的性能;

28.建議用memcached,高性能的分佈式內存對象緩存系統,提高動態網絡應用程序性能,減輕數據庫的負擔;

29.使用ip2long()和long2ip()函數把IP地址轉成整型存放進數據庫而非字符型。這幾乎能降低1/4的存儲空間。同時可以很容易對地址進行排序和快速查找;

30.使用checkdnsrr()通過域名存在性來確認部分email地址的有效性,這個內置函數能保證每一個的域名對應一個IP地址;

31.如果你在使用php5和mysql4.1以上的版本,考慮使用mysql_*的改良函數mysqli_*;

32.試着喜歡使用三元運算符(?:);

33.在你想在徹底重做你的項目前,看看PEAR有沒有你需要的。PEAR是個巨大的資源庫,很多php開發者都知道;

34.使用highlight_file()能自動打印一份很好格式化的頁面源代碼的副本;

35. 使用error_reporting(0)函數來預防潛在的敏感信息顯示給用戶。理想的錯誤報告應該被完全禁用在php.ini文件裏。可是如果你在用一 個共享的虛擬主機,php.ini你不能修改,那麼你最好添加error_reporting(0)函數,放在每個腳本文件的第一行(或用 require_once()來加載)這能有效的保護敏感的SQL查詢和路徑在出錯時不被顯示;

36.使用 gzcompress() 和gzuncompress()對容量大的字符串進行壓縮(解壓)在存進(取出)數據庫時。這種內置的函數使用gzip算法能壓縮到90%;

37.通過參數變量地址得引用來使一個函數有多個返回值。你可以在變量前加個“&”來表示按地址傳遞而非按值傳遞;

38.Fully understand “magic quotes” and the dangers of SQL injection. I’m hoping that most developers reading this are already familiar with SQL injection. However, I list it here because it’s absolutely critical to understand. If you’ve never heard the term before, spend the entire rest of the day googling and reading.

39.使用strlen()因爲要調用一些其他操作例如lowercase和hash表查詢所以速度不是太好,我們可以用isset()來實現相似的功能,isset()速度優於strlen();

40.When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.

轉自:http://rubel.iteye.com/blog/512536


繼續補充:

   

1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,儘量用file_get_contents,因爲他的效率高得多!但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題;

2.儘量的少進行文件操作,雖然PHP的文件操作效率也不低的;

3.優化Select SQL語句,在可能的情況下儘量少的進行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 CODE Highliting for CU by dZ902

<?php
class foo {
     function bar() {
         echo 'foobar';
     }
}

$foo = new foo;

// instance way

$foo->bar();

// static way

foo::bar();
?>

靜態地調用非 static 成員,效率會比靜態地調用 static 成員慢 50-60%。主要是因爲前者會產生 E_STRICT 警告,內部也需要做轉換。

使用類常量 (PHP5 ONLY)

貼士:PHP 5 新功能,類似於 C++ 的 const。

使用類常量的好處是:

- 編譯時解析,沒有額外開銷
- 雜湊表更小,所以內部查找更快
- 類常量僅存在於特定「命名空間」,所以雜湊名更短
- 代碼更乾淨,使除錯更方便

(暫時)不要使用 require/include_once 

require/include_once 每次被調用的時候都會打開目標文件!

- 如果用絕對路徑的話,PHP 5.2/6.0 不存在這個問題
- 新版的 APC 緩存系統已經解決這個問題

文件 I/O 增加 => 效率降低

如果需要,可以自行檢查文件是否已被 require/include。

不要調用毫無意義的函數

有對應的常量的時候,不要使用函數。

QUOTE:
// 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:

// PHP CODE Highliting for CU by dZ902

<?php
$is_win = DIRECTORY_SEPARATOR == '\\';
?>

- 不用函數
- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...通用
- 一直可用

時間問題 (PHP>5.1.0 ONLY)

你如何在你的軟件中得知現在的時間?簡單,「time() time() again, you ask me...」。

不過總歸會調用函數,慢。

現在好了,用 $_SERVER['REQUEST_TIME'],不用調用函數,又省了。

加速 PCRE

- 對於不用保存的結果,不用 (),一律用 (?

這樣 PHP 不用爲符合的內容分配內存,省。效率提升 15% 左右。

- 能不用正則,就不用正則,在分析的時候仔細閱讀手冊「字符串函數」部分。有沒有你漏掉的好用的函數?

例如:

strpbrk()
strncasecmp()
strpos()/strrpos()/stripos()/strripos()

加速 strtr

如果需要轉換的全是單個字符的時候,用字符串而不是數組來做 strtr:

QUOTE:
// PHP CODE Highliting for CU by dZ902

<?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 (PHP5 ONLY)

按照上面的道理,substr_compare 應該比先 substr 再比較快咯。答案是否定的,除非:

- 無視大小寫的比較
- 比較較大的字符串

不要用常量代替字符串

爲什麼:

- 需要查詢雜湊表兩次
- 需要把常量名轉換爲小寫(進行第二次查詢的時候)
- 生成 E_NOTICE 警告
- 會建立臨時字符串

效率差別:700%。

不要把 count/strlen/sizeof 放到 for 循環的條件語句中

貼士:我的個人做法

QUOTE:
// PHP CODE Highliting for CU by dZ902

<?php
for ($i = 0, $max = count($array);$i < $max; ++$i);
?>

效率提升相對於:

- count 50%
- strlen 75%

短的代碼不一定快

QUOTE:

// 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);
?>

你覺得哪個快?

效率比較:

- longest: 4.27
- longer: 4.43
- short: 4.76

不可思議?再來一個:

QUOTE:
// 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('.');
?>

哪個快?

效率比較:

- original: 3.37
- glob: 6.28
- scandir: 3.42
- original without OO: 3.14
- SPL (PHP5): 3.95

畫外音:從此也可以看出來 PHP5 的面向對象效率提高了很多,效率已經和純函數差得不太多了。

提高 PHP 文件訪問效率

需要包含其他 PHP 文件的時候,使用完整路徑,或者容易轉換的相對路徑。

QUOTE:
// PHP CODE Highliting for CU by dZ902

<?php

include 'file.php'; // bad approach

incldue './file.php'; // good

include '/path/to/file.php'; // ideal

?>

物盡其用

PHP 有很多擴展和函數可用,在實現一個功能的之前,應該看看 PHP 是否有了這個功能?是否有更簡單的實現?

QUOTE:
// 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');
?>

關於引用的技巧

引用可以:

- 簡化對複雜結構數據的訪問
- 優化內存使用

QUOTE:
// PHP CODE Highliting for CU by dZ902

<?php
$a['b']['c'] = array();

// slow 2 extra hash lookups per access
for ($i = 0; $i < 5; ++$i)
    $a['b']['c'][$i] = $i;

// much faster reference based approach
$ref =& $a['b']['c'];
for ($i = 0; $i < 5; ++$i)
    $ref[$i] = $i;
?>



QUOTE:
// 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';
}
?>

榨乾 PHP,提高效率

2006-12-22 14:35

原文地址:http://www.phpchina.com/bbs/thread-13409-1-1.html

這篇雜文翻譯整理自網絡各路文檔資料(見最末的參考資料),尤其是 Ilia Alshanetsky (佩服之至) 在多個 PHP 會議上的演講,主要是各類提高 PHP 性能的技巧。爲求精準,很多部分都有詳細的效率數據,以及對應的版本等等。偷懶,數據就不一一給出了,直接給結論,如果需要看原文檔,請到文末「參考資料」部分。橙色標題爲推薦部分。

========================================================

靜態調用的成員一定要定義成 static   (PHP5 ONLY)

貼士:PHP 5 引入了靜態成員的概念,作用和 PHP 4 的函數內部靜態變量一致,但前者是作爲類的成員來使用。靜態變量和 Ruby 的類變量(class variable)差不多,所有類的實例共享同一個靜態變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章