PHP項目優化主要三個方面
一、PHP語言級性能優化
二、PHP周邊問題的性能優化
三、PHP底層
PHP語言級性能優化
1)少寫代碼,多用PHP自身能力。儘量使用PHP原生函數和常量,類如果要實現的功能有原生PHP函數,則不要自己用PHP實現
2)儘量使用性能更高的內置函數比如isset和array_key_exists都可以使用,則使用isset
3)產生額外開銷的錯誤抑制符@
4)合理使用內存(PHP有內存回收機制保底,但也請小心使用內存,建議:利用unset() 及時釋放不使用的內存)
5)儘量少的使用正則表達式(建議,利用字符串處理函數,實現相同邏輯)
6)循環內的計算式將會被重複計算。經常犯的錯誤是把一個SQL 操作放置到一個循環中,這就導致頻繁的訪問數據庫,更重要的是,這會直接導致腳本的性能低下。以下的例子,你能夠把一個循環操作重置爲一個單一的SQL語句。
例:
<span style="color:#333333;"><?php
//建議
$str = 'hello world';
$strlen = strlen($str);
for($i = 0 ; $i<$strlen;$i++){
}
?></span>
?>
<span style="color:#333333;">foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
過程:
1
INSERT INTO users (first_name,last_name) VALUES("John", "Doe")</span>
<span style="color:#333333;">替換成:</span>
<span style="color:#333333;"><pre name="code" class="html">$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
過程:
1
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...</span>
7)沒有原因不要copy變量。有時初級phper,爲了使代碼更加“乾淨”,常常把已經定義的變量重新賦值給另一個變量。這實際上就導致了雙重內存的消耗(當改變變量的時候),這就導致腳本的性能下降。比如一個用戶把一個512KB的變量在額外插入給另一個變量,那麼就會導致1MB的內存被消耗掉。
<span style="color:#333333;">$description = strip_tags($_POST['description']);
echo $description;
</span>
替換爲:
<span style="color:#333333;"><span style="font-size:14px;">echo strip_tags($_POST['description']);</span></span>
周邊:
1)Linux 運行環境
文件存儲(硬盤,ssd)
數據庫(MySQL 索引使用,NoSQL+MySQL的配合使用,MySQL主從等)
緩存(memcache redis)
2)減少文件類操作
常見PHP場景的開銷次序:
讀寫磁盤、讀寫數據庫、讀寫內存、讀寫網絡數據
讀寫內存<< 讀寫數據庫<讀寫磁盤<讀寫網絡數據(基於文件系統)
3)優化網絡請求
例: 對方接口的不確定因素,網絡穩定性
設置超時時間
a)連接超時 (不能超過 200ms) b)讀超時(800ms) c)寫超時(500ms)
2) 將串行請求並行化
a)使用curl_multi_*() b)使用swoole擴展
4)壓縮PHP接口輸出
5)PHP緩存重複計算內容
6)Smarty 調優和重疊時間窗口思想
7)使用xhprof分析項目源碼,找出瓶頸進行優化
工具:XHPorf(源自Fackbook的PHP性能分析工具)
ab - 壓力測試
vld - opcode 代碼分析
PHP底層
1)使用opcode擴展 緩存PHP的opcode代碼,減少PHP的編譯過程
2)CPU密集或者複雜功能使用PHP的pecl擴展(swoole等優秀擴展的使用)3)HHVM,百度再用,不過還是讓我們坐等PHPNG的問世,有PHPNG,HHVM就不是必須的選擇了