## PHP性能優化
1. PHP語法使用的不恰當。
2. 使用PHP語言做了它不擅長做的事。
3. 用PHP語言連接的服務不給力。
4. PHP自身的短板。
5. 我也不知道的問題。
## PHP性能占比
1. PHP性能問題,占用整個項目的整體性能30%-40%之間。
2. PHP語言級的性能優化。
3. PHP周邊問題的性能分析。比如,服務器環境,硬件配置,數據庫配置。
4. PHP語言自身分析,優化。底層C的分析。
5. 2、3、4是有簡單到復雜的過程。
## 壓力測試工具簡介
### Apache Benchmark(ab)
#### 如何使用
~~~
./ab -n1000 -c100 http://www.baidu.com/
-n請求數 總共發起1000次請求
-c并發數 一次的并發量是100
url 目標壓測地址
~~~
性能優化之前使用ab
性能優化之后使用ab
對比吞吐量和處理耗時
ab測試主要關注系統<span style="color:red">吞吐量</span> 和 <span style="color:red">服務器處理時間</span>這兩個點。
## PHP語言級性能優化
1. 少些代碼,多用PHP自身能力。
2. 自寫代碼冗余比較多,可讀性不佳,并且性能差。
3. php代碼需要編譯解析為底層語言,這一過程每次請求都會處理一遍,開銷大。
4. 多使用PHP內置變量、常量、函數。
## PHP代碼運行流程

1. PHP內置函數的性能優劣。
2. 盡量少用魔法函數(為了給PHP程序員省事,PHP語言為你做了很多)
產生額外開銷的錯誤抑制符@
情況描述:PHP提供的錯誤抑制符@只是為了方便懶人。會增加額外開銷。
vld PHP Opcode 查看擴展
#### 1)合理使用內存
PHP有內存回收機制保底,但也請小心使用內存。
可以利用unset()及時釋放不使用的內存。
#### 2)盡量少的使用正則表達式
利用字符串處理函數,實現相同邏輯。
#### 3)避免在循環內做運算
循環內的計算式將會被重復計算。
~~~
$str = "hello world";
for($i=0;$i<strlen($str);$i++){
//do something strlen 會計算多次。
}
~~~
#### 4)PHP不適合密集型運算場景
PHP的語言特性決定了PHP不適合做大數據量運算。
#### 5)PHP適合銜接Webserver與后臺服務,UI呈現。
#### 6)務必使用帶引號字符串做鍵值。
php會將沒有引號的鍵值當做常量,產生查找常量的開銷。
## PHP周邊環境
1)linux服務器
2)硬盤是硬件
3)mysql是軟件
4)apache
5)內存

#### 減少文件類的操作
PHP場景開銷次序
1. 讀寫磁盤
2. 讀寫數據庫
3. 讀寫內存
4. 讀寫網絡數據
讀寫內存 << 讀寫數據庫 < 讀寫磁盤 < 讀寫網絡數據(其實是磁盤操作+網絡延遲)
#### 優化網絡請求
1. 對方接口不確定因素。
2. 網絡穩定性。
3. 設置超時時間,1、連接超時200ms,2、讀超時800ms,3、寫超時500ms
4. 將串行請求并行化。使用 curl_multi_*();,使用swoole擴展。
#### 壓縮PHP接口輸出
使用Gzip即可。壓縮后更快傳輸數據,但是會產生額外的CPU開銷。
#### 緩存重復計算內容
多次請求內容不變情況。
#### 重疊時間窗口理想
PHP是串行執行的。
前后任務沒有強依賴關系,可以使用重疊時間窗口

#### 旁路方案

xhprof 工具分析PHP性能。
https://www.jianshu.com/p/c420ebe6ce39
### php性能瓶頸終極提升
Opcode Cache:PHP擴展APC,APC緩存PHP編譯后的代碼。
Runtime優化:HHVM
- 簡介
- Cookie
- HTML5 LocalStorage
- session
- 當瀏覽器關閉后,Session就銷毀了嗎?
- mysql數據庫保存session
- HTTP協議的由來
- fsockopen異步請求
- http防盜鏈
- Apache偽靜態知識補充
- 大并發量解決方案
- 大型網站是怎樣解決多用戶高并發訪問
- 網站高并發 大流量訪問的處理及解決方法
- 并發數與在線客戶數?注冊用戶數的關系
- 即時聊天程序
- 反向Ajax實現
- ob緩存作用
- 淺聊并發之戰
- php擴展安裝
- php安裝redis擴展
- SQLMap自動化實施SQL注入共計
- 命名空間namespace
- 集群和分布式之【session共享】
- php Redis存儲Session 【1】
- php Redis存儲Session 【2】
- php mysql存儲session【1】
- php緩存
- 文件緩存
- memcache和redis的比較
- 原生session與session in redis對比
- XSS攻擊【1】
- XSS攻擊【2】
- PHP消息隊列
- php+mysql 模擬發送郵件隊列
- php+mysql 模擬訂單處理隊列
- php+redis 模擬秒殺隊列
- RabbitMQ 消息隊列系統
- beanstalkd
- PHP構建即時通訊
- WebSocket協議
- workerman
- PHP變量的作用域
- PHP傳值和傳引用的區別
- PHP匿名函數
- PHP遞歸函數&應用
- PHP單例模式
- PHP性能優化
- RESTful
- 集群
- 增加pgsql擴展
- php.ini路徑查找
- Swoole Compiler
- mysql 主從
- 主從
- mysql-proxy
- window docker環境