php高性能
⑴ 怎樣提高php運行效率
1、 如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。
2、$row[』id』] 的速度是$row[id]的7倍。
3、echo 比 print快,並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接,比如echo$str1,$str2。
4、在執行for循環之前確定最大循環數,不要每循環一次都計算最大值,最好運用foreach代替。
5、注銷那些不用的變數尤其是大數組,以便釋放內存。
6、盡量避免使用__get,__set,__autoload。
7、require_once()代價昂貴。
8、include文件時盡量使用絕對路徑,因為它避免了PHP去include_path里查找文件的速度,解析操作系統路徑所需的時間會更少。
9、如果你想知道腳本開始執行(譯註:即伺服器端收到客戶端請求)的時刻,使用$_SERVER[『REQUEST_TIME』]要好於 time()。
10、函數代替正則表達式完成相同功能。
11、str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。
12、如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換代碼,使得每次傳遞參數是一個字元,而不是只寫一行代碼接受數組作為查詢和替換的參數。
13、使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句。
14、用@屏蔽錯誤消息的做法非常低效,極其低效。
15、打開apache的mod_deflate模塊,可以提高網頁的瀏覽速度。
16、資料庫連接當使用完畢時應關掉,不要用長連接。
17、錯誤消息代價昂貴。
18、在方法中遞增局部變數,速度是最快的。幾乎與在函數中調用局部變數的速度相當。
19、遞增一個全局變數要比遞增一個局部變數慢2倍。
20、遞增一個對象屬性(如:$this->prop++)要比遞增一個局部變數慢3倍。
21、遞增一個未預定義的局部變數要比遞增一個預定義的局部變數慢9至10倍。
22、僅定義一個局部變數而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變數)。PHP大概會檢查看是否存在全局變數。
23、方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化。
24、派生類中的方法運行起來要快於在基類中定義的同樣的方法。
25、調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變數遞增操作。類似的方法調用所花費的時間接近於15次的局部變數遞增操作。
26、Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本。
27、除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷。
28、盡量做緩存,可使用memcached。memcached是一款高性能的內存對象緩存系統,可用來加速動態Web應用程序,減輕資料庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯。
29、當操作字元串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變數)中存儲的已知字元串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫)、哈希查找,會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的代碼。
(舉例如下)
if (strlen($foo) < 5) { echo 「Foo is too short」$$ }
(與下面的技巧做比較)
if (!isset($foo{5})) { echo 「Foo is too short」$$ }
調用isset()恰巧比strlen()快,因為與後者不同的是,isset()作為一種語言結構,意味著它的執行不需要函數查找和字母小寫化。也就是說,實際上在檢驗字元串長度的頂層代碼中你沒有花太多開銷。
34、當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或 Java代碼並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變數,這個臨時變數隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的互聯網服務提供商(ISPs)和伺服器。
35、並不是事必面向對象(OOP),面向對象往往開銷很大,每個方法和對象調用都會消耗很多內存。
36、並非要用類實現所有的數據結構,數組也很有用。
37、不要把方法細分得過多,仔細想想你真正打算重用的是哪些代碼?
38、當你需要時,你總能把代碼分解成方法。
39、盡量採用大量的PHP內置函數。
40、如果在代碼中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們。
41、評估檢驗(profile)你的代碼。檢驗器會告訴你,代碼的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程序,評估檢驗總體上可以顯示出代碼的瓶頸。
42、mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%。
43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用 file_get_contents,因為他的效率高得多!但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題;
44、盡量的少進行文件操作,雖然PHP的文件操作效率也不低的;
45、優化Select sql語句,在可能的情況下盡量少的進行Insert、Update操作;
46、盡可能的使用PHP內部函數(但是我卻為了找個PHP裡面不存在的函數,浪費了本可以寫出一個自定義函數的時間,經驗問題啊!);
47、循環內部不要聲明變數,尤其是大變數:對象(這好像不只是PHP裡面要注意的問題吧?);
48、多維數組盡量不要循環嵌套賦值;
49、在可以用PHP內部字元串操作函數的情況下,不要用正則表達式;
50、foreach效率更高,盡量用foreach代替while和for循環;
51、用單引號替代雙引號引用字元串;
52、「用i+=1代替i=i+1。符合c/c++的習慣,效率還高」;
53、對global變數,應該用完就unset()掉。
⑵ 如何使用 PHP 構建一個高性能的彈幕後端服務
隨著WEB2.0的流行,現在很多網站都流行使用「彈幕」這種形式來實現互動。
彈幕(barrage),中文流行詞語,原意指用大量或少量火炮提供密集炮擊。大量以字幕彈(dàn)出形式顯示的評論同時在屏幕上飄過的現象也被稱為彈幕。
作為PHPer的我們,看到現在各種網站都有酷炫的彈幕飛過,我們是不是也想給自己的網站加入彈幕功能呢?
首先彈幕的後端其實說白了和公共聊天室的後端原理十分相似,都是一個客戶端發送消息給服務端,服務端再將收到的消息廣播給其他的客戶端。對於後端來說他們幾乎沒區別,區別就在於前端。
好在我們有一個前端彈幕插件,這個插件是一個jquery插件,github地址:https://github.com/chiruom/jquery.danmu.js,基本上會使用jquery語法,看看示例代碼就可以傻瓜化使用。
前端已經有了解決方案,但是後端呢?前端如何與後端通訊?用傳統的ajax輪詢嗎?不行,這樣效率太低,想想各大火爆的直播平台都是同一時間幾萬人在線,幾千人同時發彈幕,如果靠ajax輪詢一個php介面的話伺服器會吃不消的。且彈幕消息存儲方案略顯復雜,有人問為什麼要存儲呢?因為ajax使用的HTTP協議是無狀態協議,A客戶端和B客戶端之間對於伺服器來說沒有任何標志,如果伺服器要確保A客戶端和B客戶端分別在兩次請求的時候伺服器只返回這兩個客戶端沒有獲取過的彈幕消息,那麼伺服器端就必須使用一個緩存來標識某某客戶端看過哪條彈幕消息。綜上所述ajax可以實現小規模的彈幕通信方案,但是很麻煩。
好在最新的HTML5中加入了WebSocket協議,我們可以通過WebSocket這種基於HTTP協議之上的即時通信協議來替代ajax這種傳統的我問你答的老舊通信模式。而我們是PHPer,對於我們這種只懂PHP的人該如何編寫WebSocket服務端呢?好在我們又得知PHP有一個Swoole擴展,我們在PHP語言中使用它可以很方便的構建一個WebSocket服務端。
關於Swoole的介紹可以參照他的官網http://www.swoole.com/,下面引用官網對它的一段簡短的介紹。
PHP的非同步、並行、高性能網路通信引擎,使用純C語言編寫,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,非同步Redis,資料庫連接池,AsyncTask,消息隊列,毫秒定時器,非同步文件讀寫,非同步DNS查詢。 Swoole內置了Http/WebSocket伺服器端/客戶端、Http2.0伺服器端。
Swoole可以廣泛應用於互聯網、移動通信、企業軟體、雲計算、網路游戲、物聯網(IOT)、車聯網、智能家居等領域。 使用PHP+Swoole作為網路通信框架,可以使企業IT研發團隊的效率大大提升,更加專注於開發創新產品。
先別被Swoole這么多的功能嚇到了。我們先關注這裡面的重點Swoole內置了Http/WebSocket伺服器端/客戶端意味著我們可以通過它構建WebSocket的服務端。看到這里我們是不是就急急忙忙去拿官網的WebSocket服務端代碼做測試呢?不,Swoole是一個PHP擴展,意味著我們還得去安裝它。是不是直接去下載so文件然後在php.ini中加入extension=swoole.so就可以了呢?還不是,我們先去看看Swoole擴展的依賴,這也是我們使用任何語言的任何外部包,外部模塊,外部擴展最先要了解的問題。
參考官網:http://wiki.swoole.com/wiki/page/7.html環境依賴
僅支持linux,FreeBSD,MacOS,3類操作系統
Linux內核版本2.3.32以上
PHP5.3.10以上版本,包括PHP7
gcc4.4以上版本或者clang
cmake2.4+,編譯為libswoole.so作為C/C++庫時需要使用cmakePHP版本依賴
swoole僅支持PHP5.3.10或更高版本,建議使用PHP5.4+swoole不依賴php的stream、sockets、pcntl、posix、sysvmsg等擴展。PHP只需安裝最基本的擴展即可意味著我們Windows下是無法使用這個擴展了(其實可以藉助cygwin在win下使用swoole,但是考慮到我們使用swoole擴展就是為了性能,也為了熟悉以後的生產環節部署做准備,強烈推薦在linux下開發),那麼我們把開發環境轉移到Linux下進行吧。
接著還要求Linux內核版本為2.3.32以上,PHP為5.3.10以上,那麼我們就用最新的CentOS吧,這個版本的yum安裝的php直接就是PHP7最新版,根本無需考慮其他問題,當然你喜歡圖形界面,用Ubuntu也可以。其他的基本上最新的Linux發行版都是符合版本要求的。
接著我們便來安裝這個擴展,推薦使用PECL來安裝,只需要一條pecl install swoole
即可,非常方便。當然你要編譯安裝,具體步驟請參考http://wiki.swoole.com/wiki/page/6.html安裝完擴展之後在命令行下輸入
php -m
檢查,如果有swoole那麼說明安裝成功了。
接下來就正式開始我們的編碼旅程了。
開始編碼旅程之前我們先看看最基礎的效果原型是什麼樣子沒錯就是這個樣子,兩個瀏覽器之前完全獨立使用Websocket連接服務端,因此對於服務端來說這兩個瀏覽器就相當於兩個完全處在不同機器上的客戶端。
效果看完了就開始來講代碼吧。
我們先看看官網的WebSocket服務端示例代碼。
$serv = new Swoole\Websocket\Server("127.0.0.1", 9502);$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
$serv->start();
我們看到這個代碼的第一行先是new了一個WebSocket服務端對象,並且在構造方法中的第一個參數指定了服務端監聽的IP,第二個參數指定了服務端監聽的埠。然後使用on方法為每一個事件設置了回調函數,最後一行start方法正式開始運行服務端。
這種寫法非常像Javascript裡面的非同步調用,這也是Swoole中的事件驅動非同步非阻塞特性,正因為是這種特性,每一個獨立的事件(請求)會在服務端接收到之後分別非同步處理,他們之間無需互相等待,這也是Swoole性能高的原因所在。
我們來分別剖析一下每一個事件的含義。
$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
顧名思義,Open表示打開一個新的鏈接,並且在事件觸發之後echo出連接上服務端的客戶端id,該客戶端唯一id為回調函數第二個參數中的fd欄位。這也是服務端區分客戶端的唯一id。
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
同樣顧名思義,Message表示消息到達服務端的事件,並且在事件觸發之後echo出發送給服務端的數據,該數據為回調函數第二個參數的data欄位。另外我們還看到它調用了$server->push,這是回調函數的第一個參數中的push方法,它是一個服務端給客戶的發送數據的方法,第一個參數為要發送的客戶端id,第二個為要發送的數據,這里的含義是向發給服務端消息的那個客戶端發送["hello", "world"]這個數組(方括弧寫數組為PHP5.4的新特性,如果你是PHP5.3請使用傳統的array工廠函數生成數組)經過json序列化之後的數據。
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
最後一個事件Close更加容易理解,就是關閉事件,當然關閉的不是服務端,而是客戶端,可以理解為客戶端與服務端斷開連接的事件。回調函數中的代碼含義為echo出與服務端斷開連接的那個客戶端id。
基本的API都清楚了,下面就直接看代碼吧,短短二十行而已。
https://github.com/cw1997/danmu-demo/blob/master/server.php$server = new swoole_websocket_server("0.0.0.0", 1997);$server->on('open', function (swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客戶端id});
$server->on('message', function (swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";//$frame->fd 是客戶端id,$frame->data是客戶端發送的數據//服務端向客戶端發送數據是用 $server->push( '客戶端id' , '內容')$data = $frame->data;
foreach($server->connections as $fd){
$server->push($fd , $data);//循環廣播
}
});
$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});
$server->start();
這里最核心的廣播代碼其實還用到了一個之前沒有提到過的成員,也就是swoole_websocket_server對象的connections成員,這個成員中保存了所有已連接上該WebSocket服務端的fd,也就是客戶端id。因此我們只要在message事件中使用foreach遍歷該成員,循環將所有服務端收到的彈幕消息都發送給其他已連接上該服務端的客戶端即可。
後端講完了再講講前端吧。
前端代碼也不是很多https://github.com/cw1997/danmu-demo/blob/master/index.htmlvar ws = new WebSocket("ws://192.168.1.107:1997");ws.onopen = function(){
console.log("握手成功");
ws.send('hello world!!!');
};
ws.onmessage = function(e){
console.log("message:" + e.data);
var time = jQuery('#danmu').data("nowtime") + 1;var text_obj = '{ "text":"' + e.data + '" , "color":"green" ,"size":"1","position":"0","time":"' + time + '" ,"isnew":" "}'; //構造加上了innew屬性的字元串danmu對象console.log(text_obj);
var new_obj = eval('(' + text_obj + ')'); //轉化為js對象jQuery('#danmu').danmu("add_danmu", new_obj); //向插件中添加該danmu對象};
ws.onerror = function(){
console.log("error");
};
核心代碼都在這里,使用new WebSocket("ws://192.168.1.107:1997")創建一個WebSocket客戶端連接對象,通過該對象的各種事件進行對應的操作,和服務端是不是很像?更多代碼解釋可以參考源代碼中的注釋,這里不做更多介紹。
看到這里相信作為一名PHPer的你也可以開發出屬於自己的彈幕系統了。這里展示的只是一個最基礎最原始的彈幕平台。我們也了解到了使用PHP開發一個彈幕平台需要涉及到的技術有WebSocket,Swoole擴展,甚至碰到了很多初級開發者平時不怎麼接觸的工具,比如說PECL,比如說Linux。
其實PHP結合Swoole擴展還可以做很多事情,比如說對接各種家電,對接各種硬體介面實現在Web端實時控制家電,又比如說結合樹莓派做智能小車,通過web端進行遙控等等,各種新奇的玩法等你發現。誰說PHP只能做Web開發?PHP擁有了Swoole擴展其實能做的事情還有很多,Swoole就像他的宣傳標題一樣:重新定義PHP。
⑶ 提高PHP開發效率的技巧
用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變數,單引號則不會,注意:只有echo能這么做,它是一種可以把多個字元串當作參數的「函數」(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)。
1、如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。
2、$row[』id』] 的速度是$row[id]的7倍。
3、echo 比 print 快,並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接,比如echo $str1,$str2。
4、在執行for循環之前確定最大循環數,不要每循環一次都計算最大值,最好運用foreach代替。
5、注銷那些不用的變數尤其是大數組,以便釋放內存。
6、盡量避免使用__get,__set,__autoload。
7、require_once()代價昂貴。
8、include文件時盡量使用絕對路徑,因為它避免了PHP去include_path里查找文件的速度,解析操作系統路徑所需的時間會更少。
9、如果你想知道腳本開始執行(譯註:即伺服器端收到客戶端請求)的時刻,使用$_SERVER[『REQUEST_TIME』]要好於time()。
10、函數代替正則表達式完成相同功能。
11、str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。
⑷ 鳥哥:讓PHP 7達到最高性能的幾個Tips
在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"
⑸ 讓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帶來的影響。
⑹ 高性能PHP應用開發的目錄
第1章基準測試技術1
1.1PHP應用程序棧1
1.2基準測試實用工具2
1.3定義請求/響應生命周期3
1.4Apache Benchmark4
1.4.1安裝Apache Benchmark4
1.4.2運行Apache Benchmark5
1.4.3弄清響應的含義6
1.4.4ab選項標記8
1.4.5ab陷阱11
1.5Siege12
1.5.1安裝Siege12
1.5.2運行Siege13
1.5.3分析結果13
1.5.4Siege選項標記15
1.5.5測試很多URL15
1.6影響基準測試數字16
1.6.1地理位置16
1.6.2旅行的數據包16
1.6.3響應的大小16
1.6.4代碼復雜性17
1.6.5瀏覽器行為18
1.6.6Web伺服器設置18
1.7小結19
第2章提高客戶端下載和呈現性能20
2.1優化響應的重要性21
2.2Firebug21
2.2.1安裝Firebug22
2.2.2Firebug性能選項卡22
2.2.3Console選項卡23
2.2.4Net選項卡25
2.3YSlow26
2.3.1YSlow v2規則集26
2.3.2安裝YSlow27
2.3.3啟動YSlow28
2.4Page Speed30
2.4.1安裝Page Speed31
2.4.2運行中的Page Speed31
2.5優化工具32
2.5.1JavaScript優化33
2.5.2JavaScript的放置位置33
2.5.3精簡JavaScript36
2.6精簡工具37
2.7YUI Compressor38
2.8Closure Compiler38
2.8.1減少資源請求39
2.8.2使用伺服器端壓縮39
2.9圖像壓縮39
第3章PHP代碼優化43
3.1PHP最佳實踐43
3.1.1PHP的經濟性45
3.1.2require與require_once45
3.1.3提前計算循環長度47
3.1.4使用foreach、for、while循環訪問數組元素49
3.1.5文件訪問50
3.1.6更快速地訪問對象屬性52
3.2使用VLD、strace和Xdebug一探究竟54
3.2.1用VLD查看Opcode函數54
3.2.2使用strace進行C級跟蹤56
3.3發現瓶頸58
3.3.1Xdebug 2:PHP調試工具58
3.3.2驗證安裝60
3.3.3安裝基於GUI的工具61
3.4小結64
第4章Opcode緩存65
4.1回顧路線圖65
4.2PHP的生命周期66
4.3Opcode緩存工具68
4.3.1Alternative PHP Cache68
4.3.2XCache75
4.3.3用XCache緩存76
4.3.4XCache設置77
4.3.5eAccelerator78
4.3.6eA設置82
4.4小結84
第5章變數緩存85
5.1應用程序的性能路線圖85
5.2實現變數緩存的價值86
5.3示例項目:創建表87
5.3.1獲取記錄88
5.3.2計算讀取資料庫的開銷89
5.4APC緩存93
5.4.1將數據添加到緩存中93
5.4.2對APC進行基準測量94
5.5Memcached96
5.5.1安裝Memcached96
5.5.2啟動Memcached伺服器97
5.5.3在PHP中使用Memcached97
5.6小結101
第6章選擇正確的Web伺服器102
6.1選擇適合你的Web伺服器程序包103
6.1.1安全性和穩定性非常重要103
6.1.2找到具有豐富知識的工程師非常重要103
6.1.3你的網站主要是靜態內容103
6.1.4你在託管服務中託管103
6.1.5你正在使用不常見的PHP擴展103
6.2Web伺服器的使用情況圖表103
6.3Web伺服器請求的處理104
6.4Web伺服器硬體105
6.5對Web伺服器進行分類106
6.6Apache HTTPD106
6.6.1Apache Daemon命令行107
6.6.2Apache多處理模塊108
6.7了解Apache模塊109
6.7.1添加動態Apache模塊110
6.7.2刪除動態Apache模塊110
6.8關於Apache的最後幾點111
6.9lighttpd111
6.9.1安裝lighttpd111
6.9.2lighttpd配置設置113
6.9.3比較靜態負載內容114
6.9.4在lighttpd上安裝PHP115
6.10Nginx118
6.10.1安裝Nginx118
6.10.2Windows安裝121
6.11Nginx作為靜態Web伺服器122
6.11.1安裝FastCGI PHP123
6.11.2Nginx基準測試124
6.12小結126
第7章優化Web伺服器和內容交付127
7.1測定Web伺服器的性能127
7.2了解應用程序的內存佔用情況129
7.3優化Apache中的進程130
7.3.1控制Apache客戶端(PreforkMPM)131
7.3.2優化內存使用和防止產生交換131
7.4其他Apache配置調整131
7.4.1使用.htaccess文件和AllowOverride132
7.4.2使用FollowSymlinks133
7.4.3使用DirectoryIndex133
7.4.4關閉HostnameLookup133
7.4.5啟用Keep-Alive134
7.4.6使用mod_deflate壓縮內容134
7.5擴展到單台伺服器之外135
7.5.1使用Round-Robin DNS135
7.5.2使用負載均衡器135
7.5.3使用直接伺服器返回137
7.5.4在伺服器場的成員之間共享會話138
7.5.5與共享文件系統共享資產139
7.5.6與獨立資產伺服器共享資產140
7.5.7與內容分發網路共享資產140
7.6使用分布式架構的陷阱141
7.6.1緩存一致性問題141
7.6.2緩存版本問題141
7.6.3用戶IP地址跟蹤142
7.6.4多米諾骨牌或級聯失敗效應143
7.6.5部署失敗143
7.7監視應用程序144
7.8小結144
第8章資料庫優化145
8.1MySQL簡介146
8.2了解MySQL存儲引擎146
8.2.1MyISAM:原始引擎147
8.2.2InnoDB:專業級的選擇147
8.2.3選擇存儲引擎148
8.3了解MySQL如何使用內存148
8.3.1InnoDB與MyISAM內存使用的比較149
8.3.2每伺服器與每連接(線程)內存使用的比較149
8.4查找配置文件150
8.4.1Mysqltuner:優化資料庫伺服器的內存151
8.4.2示例伺服器可能出現的問題154
8.4.3優化InnoDB155
8.5找到有問題的查詢155
8.6分析有問題的查詢157
8.7PHP資料庫應用程序的建議158
8.7.1保持獨立的讀寫連接158
8.7.2默認使用「utf 8」(多位元組Unicode)字元集158
8.7.3使用「UTC」日期格式159
8.8小結160
附錄A在Windows上安裝Apache、MySQL、PHP和PECL161
附錄B在Linux上安裝Apache、MySQL、PHP和PECL174
⑺ 何時PHP能夠像C++那樣高性能
首先,個人認為指針決定了快慢。C++可以直接操作指針,而PHP是C封裝起來的。
第二、兩門語言用途不同。C++做游戲、做操作系統以及做桌面應用程序等。所以經常和內存打交道。PHP主要做web站點。而web站點的快慢主要取決與資料庫,PHP這門語言對之的影響和資料庫相比較,我感覺可以忽略不計。
最後:我覺得糾結兩門語言是否高性能,不是太重要。當然您如果是開發多年的大神,您就當我沒說過吧。我還不到那個等級---
⑻ php是世界上最好的語言
PHP是世界上最好的語言。這是網路上廣泛流傳的一個梗,並不是說PHP就真的是編程最好的語言,其實每款編程語言都有自身的優勢以及所專長的領域,並不能簡單地說PHP就是最好的編程語言,這多少有點調侃的成分。
PHP優點
(一)流行,容易上手
PHP是目前最流行的編程語言,這毋庸置疑。它驅動全球超過2億多個網站,有全球超過81.7%的公共網站在伺服器端採用PHP。PHP常用的數據結構都內置了,使用起來方便簡單,也一點都不復雜,表達能力相當靈活。
(二)開發職位很多
在伺服器端的網站編程中PHP會更容易幫助你找到工作。很多互聯網相關企業都在使用PHP開發框架,所以可以說市場對PHP的開發程序員的需求還是比較大的。
(三)仍然在不斷發展
PHP在不斷兼容著類似closures和命名空間等技術,同時兼顧性能和當下流行的框架。版本是7之後,一直在提供更高性能的應用。
(四)可植入性強
PHP 語言在補丁漏洞升級過程中,核心部分植入簡單易行,且速度快。
(五)拓展性強
PHP 語言在資料庫應用過程中,可以從資料庫調取各類數據,執行效率高。
PHP缺點
(一)PHP的解釋運行機制
在 PHP 中,所有的變數都是頁面級的,無論是全局變數, 還是類的靜態成員,都會在頁面執行完畢後被清空。
(二)設計缺陷,缺少關注PHP被稱作是不透明的語言,因為沒有堆棧追蹤,各種脆弱的輸入。沒有一個明確的設計哲學。早期的PHP受到Perl的影響,帶有out參數的標准庫又是有C語言引入,面向對象的部分又是從C++和Java學來的。
(三)對遞歸的不良支持
PHP並不擅長遞歸。它能容忍的遞歸函數的數量限制和其他語言比起來明顯少。
這句話的產生,雖然帶有一定php碼農個人感情色彩的偏見,但是未嘗沒有道理。首先,PHP的使用率遠遠高於其他語言的使用率,在web開發中佔有很大份額。
同時PHP作為一種通用開源語言,因其語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛。具有簡單易懂的語法、沒有奇怪的黑魔法、既能面向過程,又能面向對象、安裝後各種擴展集一身、包括但不限於mysql、json、mbstr等,方便至極。
在這種情況下,PHP就被戲稱為「世上最好的語言」,當然它也不負眾望,成了大部分IT碼農的首選。它的門檻低,使得更多新手小白入門快,能快速了解IT這行,以及自己的工作性質。語法簡單,很快融入其中,被成為「弱類型語言」。
現在很多重量級的開源項目都會使用PHP語言,企業開發上也越來越支持使用PHP。它成熟的框架,大大縮短開發周期,在加上成本低,導致了市場需求大。
(8)php高性能擴展閱讀
主要參考框架
(一)CodeIgniter的優點
1、配置簡單,全部的配置使用 PHP腳本來配置,執行效率高;具有基本的路由功能,能夠進行一定程度的路由;具有初步的Layout功能,能夠製作一定程度的界面外觀;資料庫層封裝的不錯,具有基本的MVC功能。
2、快速簡潔,代碼不多,執行性能高,PHP框架簡單, 容易上手,學習成本低,文檔詳細;自帶了很多簡單好用的library,框架適合小型應用。
(二)CodeIgniter 缺點
1、把Model層簡單的理解為資料庫操作。
2、PHP 框架略顯簡單,只能夠滿足小型應用,略微不太能夠滿足中型應用需要。
(三)CakePHP 的優點
1、CakePHP 是最類似於RoR的 PHP 框架,包括設計方式,資料庫操作的Active Record方式;設計層面很優雅,沒有自帶多餘的 library,所有的功能都是純粹的框架,執行效率還不錯;資料庫層的hasOne,hasMany 功能很強大,對於復雜業務處理比較合適;路由功能,配置功能還不錯;自動構建腳手架(scaffold)很強大;適合中型應用;基本實現過了MVC每一層; 具有自動操作命令行腳本功能。
2、文檔比較全,在國內推廣的比較成功,大部分人都知道CakePHP,學習成本中等。
(四)CakePHP 的缺點
1、CakePHP非常嚴重的問題是把Model理解為資料庫層操作,嚴重影響了除了資料庫之外的操作能力
2、CakePHP的cache功能略顯薄弱,配置功能稍嫌弱;CakePHP不適合大型應用,只適合中型應用,小型應用來說略微的學習成本高了點。
參考資料來源:網路-PHP
⑼ PHP開發中如何提高系統的穩定性和可靠性
PHP 應用的高性優化,很多時候我們把業務代碼做一些優化,反而是簡單又高效的。
業務的非同步解耦,比如,我們把耗時的多個分表數據的排行榜,通過其他服務做分布統計,然後再綜合,最終輸出到redis list中,那我們前端 PHP 在調用數據的時候,就不用實時計算了。
緩存的多級處理,業務復雜以後,經常看到一份相同的數據讀取 N 次,盡管是有緩存伺服器,但是讀取的時候也會有網路 I/O 的開銷,考慮到我們 PHP 一般使用場景下都是單進程,使用頻率高的,則應該優先使用進程內緩存。然後再本地緩存,然後再到網路緩存。
單例的運用,不要小看了對象的構造,很多時候我們在同一進程中,會發現同時構造了 N 多相同的對象。每一次的初始化都是一塊內存的開辟和 CPU 的消耗。
高性能,一個就是運行環境的優化,另一個是代碼本身的優化。
運行環境的優化,覆蓋面也很廣,包括系統層面的內核,文件系統類型,資料庫及緩存服務本身的性能優化,再到PHP解釋器的性能優化等等,PHP不同運行方式的差異(比如Apache模塊,還有PHP-FPM等等)。
代碼優化方面,我覺得可維護性和代碼可讀性的重要性大於高性能。代碼優化可以藉助profiling工具來分析,找到真實訪問條件下,處理瓶頸在哪裡,再去做針對性的優化。當然自己在初次設計和實現的時候,就需要做一定的整體考慮,例如怎麼設計能夠減少資料庫的查詢次數,如何減少重復的操作,了解同一問題的多種解決辦法哪一種效率更高(包括演算法上的差異,以及PHP的不同方式導致的差異等等),如何設計緩存來提高緩存命中率等等。有一些設計需要在體驗和效率上做個權衡。
保證穩定性,同樣也分運行環境和代碼本身。前者要對線上服務做完整的監控,這個有很多完善和強大的開源工具可以使用,保障基礎環境是穩定可控的,並且能夠及時發現問題,進行修復。至於代碼,除了盡量做完整的測試,開發的時候就需要考慮可能的問題。另外針對PHP,開發環境可以把error_reporting完全打開。還有需要知道常見的安全問題(XSS,SQL注入,CSRF,越權等),畢竟安全問題也是穩定的一部分。