本文目錄一覽:
如何優化PHP性能
如果一個方法能被靜態,那就聲明它為靜態的,速度可提高1/4,甚至我測試的時候,這個提高了近三倍。
當然了,這個測試方法需要在十萬級以上次執行,效果才明顯。
其實靜態方法和非靜態方法的效率主要區別在內存:靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,所以靜態方法可以直接調用,實例方法要先成生實例,通過實例調用方法,靜態速度很快,但是多了會佔內存。
任何語言都是對內存和磁盤的操作,至於是否面向對象,只是軟件層的問題,底層都是一樣的,只是實現方法不同。靜態內存是連續的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當然沒有靜態方法快。
靜態方法始終調用同一塊內存,其缺點就是不能自動進行銷毀,而是實例化可以銷毀。
php做優化包括哪些內容?
1:單引號代替雙引號,雙引號會去找變量。
2:方法定義為static,性能提升4倍。
3:$arr[‘id’]的性能是$arr[id]的7倍。
4:echo性能快,盡量使用echo $a,$b,$c而非echo $a.$b.$c。
5:循環之前確定循環次數,盡量用foreach。
6:註銷不使用的變量,節省內存。
7:盡量不使用魔法函數:__get、__set等。
8:require_once()會檢查是否載入,消耗內存。
9:include文件時使用絕對路徑,省去查找的時間。
10:腳本開始執行時間$_SERVER[『REQUEST_TIME』]要好於time()。
11:正則效率低,用函數代替。
12:str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。
13:接收客串的效率比接收數組的效率高。
14:switch case好於多個if else。
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:盡量做緩存,可使用memcached。memcached是一款高性能的內存對象緩存系統,可用來加速動態Web應用程序,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯。
29:當操作字符串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字符串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫)、哈希查找,會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的代碼。
30:當執行變量$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java代碼並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的互聯網服務提供商(ISPs)和服務器。
31:並不是事必面向對象(OOP),面向對象往往開銷很大,每個方法和對象調用都會消耗很多內存。
32:盡量採用大量的PHP內置函數。
33:如果在代碼中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們。
34:mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%。
35:在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用 file_get_contents,因為他的效率高得多!但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題。
36:盡量的少進行文件操作,雖然PHP的文件操作效率也不低的。
37:優化Select SQL語句,在可能的情況下盡量少的進行Insert、Update操作(在update上,我被惡批過)。
38:循環內部不要聲明變量,尤其是大變量:對象。
39:多維數組盡量不要循環嵌套賦值。
40:在可以用PHP內部字符串操作函數的情況下,不要用正則表達式。
41:foreach效率更高,盡量用foreach代替while和for循環。
42:用i+=1代替i=i+1。符合c/c++的習慣,效率還高。
43:對global變量,應該用完就unset()掉。
PHP程序優化有什麼好用的技巧嗎?
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()。
php代碼優化及php相關問題總結
1,在函數中,傳遞數組時
使用
return
比使用
global
要高效
比如
function
userloginfo($usertemp){
$detail=explode(“|”,$usertemp);
return
$detail;
}
$login=userloginfo($userdb);
比
function
userloginfo($usertemp){
global
$detail;
$detail=explode(“|”,$usertemp);
}
userloginfo($userdb);
要高效
2,(這個代碼用於得到程序目錄對應的網址,推薦使用)
$urlarray=explode(‘/’,$HTTP_SERVER_VARS[‘REQUEST_URI’]);
$urlcount=count($urlarray);unset($urlarray[$urlcount-1]);
$ofstarurl=’http://’.$HTTP_SERVER_VARS[‘HTTP_HOST’].implode(‘/’,$urlarray);
這段代碼比
$pre_urlarray=explode(‘/’,$HTTP_SERVER_VARS[‘HTTP_REFERER’]);
$pre_url=array_pop($pre_urlarray);
要高效
3,在循環中判斷時,數值判斷使用恆等要比等於高效
$a=2;$b=2;
比如
if($a==$b)$c=$a;
比
if($a===$b)$c=$a;
高效
4,mysql
查詢時盡量使用where
in
少用
limit
limit查多記錄的前幾條,
速度很快,
但是查詢最面幾條就會慢
使用in
.在查詢連續性記錄,非常快,
非連續性記錄第一次運行會稍微慢一點,但是之後將比較快!
5,NT服務器數據操作穩定性不及unix/linux
6,輸出前使用盡量使用
ob_start();
可以加快輸出速度,適用NT或nuli/linux,對unlix類服務器
如果使用
ob_start(‘ob_gzhandler’);輸出效率將更高
7,判斷的時候盡量使用if($a==他的值)
否定的時候盡量使用if(empty($a)),因為這樣程序運行更快速
8,使用不等時
!=
與
效率相當
9,個人經驗得
使用
$a=”11111111111111″;
的效率和
$a=’11111111111111′;
相當.並不象書本說的相差很大
10,使用規範的SQL語句,
會有利於MySQL的解析
11,使用
if($online){
$online1=$online;
setcookie(‘online1’,$online,$cookietime,$ckpath,$ckdomain,$secure);
}
COOKIE將馬上生效
使用
if($online)
setcookie(‘online1’,$online,$cookietime,$ckpath,$ckdomain,$secure);
COOKIE需要再刷新一次才能生效
12,使用
$handle=fopen($filename,wb);
flock($handle,LOCK_SH);
$filedata=fread($handle,filesize($filename));
fclose($handle);
比
file($filename);
無論在速度還是穩定上都要優秀
13,截斷字符串優化函數(可避免?字符出現)
function
substrs($content,$length)
{
if(strlen($content)$length){
$num=0;
for($i=0;$i$length-3;$i++)
{
if(ord($content[$i])127)$num++;
}
$num%2==1
?
$content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
$content.=’
…’;
}
return
$content;
}
比如$newarray[1]=substrs($newarray[1],25);
14,程序中屏蔽大小寫
for
($asc=65;$asc=90;$asc++)
{
//strtolower()
此函數在一些服務器會產生亂碼!
if
(strrpos($regname,chr($asc))!==false)
{
$error=”為了避免用戶名混亂,用戶名中禁止使用大寫字母,請使用小寫字母”;
$reg_check=0;
}
}
15,不使用
file();和不使用
fget();(不穩定或速度慢)
取一數組函數
function
openfile($filename,$method=”rb”)
{
$handle=@fopen($filename,$method);
@flock($handle,LOCK_SH);
@$filedata=fread($handle,filesize($filename));
@fclose($handle);
$filedata=str_replace(“\n”,”\nofstar:”,$filedata);
$filedb=explode(“ofstar:”,$filedata);
//array_pop($filedb);
$count=count($filedb);
if($filedb[$count-1]==”){unset($filedb[$count-1]);}
return
$filedb;
}
//這個函數雖然代碼比較多,不過在速度和穩定性上優勢很大!
先寫到這
以上完全個人的一點小結,,不過正確性都經過反覆測試,如果有朋友質疑,請先測試,再討論,謝謝!
讓PHP網站跑的更快 如何優化PHP
php(做為現在的主流開發語言)是一種執行起來非常迅速的編程語言,但是比起僅僅優化代碼來說仍然值得優化php(做為現在的主流開發語言)本身。
本文我們將根據一些實效闡述為什麼優化php(做為現在的主流開發語言)本身要比優化代碼來的更貼切,以及為什麼需要理解根據php(做為現在的主流開發語言)在你的服務器上其他相關子系統的表現找出瓶頸並修復之。與此同時,我們也提到了如何優化您的php(做為現在的主流開發語言)代碼來讓他們擁有更快的執行速度。
獲得高性能
當我們談及好的性能,往往不僅僅是指您的php(做為現在的主流開發語言)代碼執行起來有多快。性能是一套在可量化評測和速度之間取出的平衡。僅僅依靠使用更少資源的代碼執行起來也許比在高速緩存中之行的代碼更慢,並且相同的一組(在高速緩衝中執行的)代碼可以在同時並發執行在一台Web服務器上。
在下面的例子中,A.php(做為現在的主流開發語言)算作一位儘可能跑得快的賽跑選手,而B.php(做為現在的主流開發語言)是一個幾乎可以以同一慢速永遠跑下去的馬拉松選手。輕負荷情況下,A.php(做為現在的主流開發語言)可以充分的快,但是當流量增加後,B.php(做為現在的主流開發語言)的性能表現將僅僅降低一點點而A.php(做為現在的主流開發語言)會垮掉。
讓我們來通過一個事實來驗證此說法更深遠的本質意義。假設我們需要讀取一個250K的文件並生成一個關於此文件的HTML概要。我們寫了兩個腳本來做同樣一件事:hare.php(做為現在的主流開發語言)將一次性讀取整個文件到內存中,然後一步執行到位;而tortoise.php(做為現在的主流開發語言)每次只讀取文件的一行,並且決不超過內容容量。結果Tortoise.php(做為現在的主流開發語言)因為多次讀寫需要更多的系統回應而慢得多。”
程序每執行一次,hare.php(做為現在的主流開發語言)需要0.04秒CPU執行時間和10Mb的內存,而tortoise.php(做為現在的主流開發語言)需要0.06秒CPU執行時間和5Mb的內存。服務器共有100Mb實際內存容量並且其CPU有99%是空閑的。我們同時假定執行這樣一個簡單事件不產生內存碎片。
當有10各程序並發執行時,hare.php(做為現在的主流開發語言)將發生內存溢出(10 ×10 = 100)。與此同時,tortoise.php(做為現在的主流開發語言)仍將有50Mb空餘內存可用!11個程序並發執行將使hare.php(做為現在的主流開發語言)徹底「潰敗」因為它開始需要使用虛擬內存——執行速度有可能降低到其常規速度的一半以下;而且現在每一個單獨程序進程需要0.08秒CPU執行時間。而此期間,tortoise.php(做為現在的主流開發語言)仍舊運行在其常規CPU執行時間——0.06秒!
以下表格中,執行得更快的php(做為現在的主流開發語言)腳本使用粗體區分開來:
——————————————————————————————
| 連接數 | 每執行1次HTTP請求所需CPU執行時間(秒)| 每執行10次HTTP請求所需CPU執行時間(秒)| 每執行11次HTTP請求所需CPU執行時間(秒)|
——————————————————————————————
| hare.php(做為現在的主流開發語言) | 0.04 | 0.04 | 0.88(內存溢出) |
——————————————————————————————
| tortoise.php(做為現在的主流開發語言) | 0.06 | 0.60 | 0.66 |
——————————————————————————————
如您在上例中看到的,獲得更好的性能不再僅僅是寫出執行起來更快的php(做為現在的主流開發語言)程序。高性能php(做為現在的主流開發語言)表現需要對底層硬件知識以及操作系統、軟件支持如Web服務器、數據庫等有一個良好認識和理解。
瓶頸
以上兩個例子讓我們看到了(性能)下降的瓶頸所在。當擁有無限大容量的內存時,hare.php(做為現在的主流開發語言)的確是始終比tortoise.php(做為現在的主流開發語言)快。但是,僅僅認為內存是php(做為現在的主流開發語言)整體性能的瓶頸所在顯得過於單純——實際上遠不止這些:
(a) 網絡
你的網絡有可能是最大的瓶頸所在。如果你有10M的帶寬——最多你只能獲得1M/秒的傳輸速度。如果假設每個php(做為現在的主流開發語言)頁為30k,那麼每秒僅僅只傳輸33頁就將使你的網絡帶寬達到飽和。更多導致瓶頸產生的因素包括頻繁訪問低速DNS,或者網絡設備僅能獲得十分有限的存儲。
(b) CPU
如果你監視一下你的CPU負荷情況,發送一個純靜態HTML頁面並不會增加CPU負擔——就像我們以上提到的,此時瓶頸在於網絡。當然啦,對於由php(做為現在的主流開發語言)生成的複雜動態頁面,你的CPU速度自然將成為限制因素之一。擁有包含多個CPU的服務器或者一個服務器陣列將減輕因CPU帶來的影響。
原創文章,作者:WMNMV,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/317197.html