# PHP性能如何優化
## 變量
> 變量的性能排行:局部變量 \> 全局變量 \> 類屬性 \> 未定義的變量
1. 變量大小,注意變量大小是節約內存的最有效的手段。對于來自表單、數據庫和文件緩存的數據都需要控制變量的大小。因為`CPU`要處理的數據是來源于內存。
2. 變量的有效期,使用`unset()`函數注銷不需要的變量是一種好習慣,將一些不需要的變量立即注銷可提高內存的使用率。
3. 變量類型,初始化變量請注意其變量類型,一個變量在執行過程中,最好只有一種類型狀態。
4. 臨時變量,是處理業務邏輯的臨時存儲,這些都是需要消耗內存的。如果臨時變量使用結束請立即注銷。
5. 靜態變量,對于一些需要由復雜業務產生的變量,如果在程序的執行過程中多次產生并使用,可以考慮使用靜態變量,減少程序的`CPU`執行次數。
## 循環
1. 盡量減少循環的次數
2. 盡量減少循環嵌套的層次
3. 避免在循環內有過多的業務邏輯
4. 不要循環包含文件
5. 不要循環執行數據庫操作
6. 優先使用`foreach`,它比`for、while`效率更高
7. 不要把`count、strlen、sizeof`放入`for`循環條件語句中
8. 保持循環體內的業務邏輯清晰
## 函數
1. 函數職責清晰,一個函數只干一件事,不雜糅過多的業務邏輯
2. 函數代碼體不超過20行,反之考慮拆分
3. 優先使用`PHP`內置函數
4. 常量與函數同時能干一件事,優先使用常量
例如:
```
?phpversion() < PHP_VERSION
?get_class() < __CLASS__
?is_null() < NULL
?// 等等。。。
```
5. `echo`的性能好于`print`,輸入多個變量的使用`echo $str1,$str2,$str3`,不用`.`連接符
6. 使用`$_SERVER['REQUEST_TIME']`替換`time()`
7. 字符串替換
~~~
?strtr() > str_replace() > preg_replace() > epreg()
~~~
8. 發揮`trim`最大功效,替換`substr`
~~~
?$file_path = trime($filename, '/').'/';
~~~
9. `isset/empty`雖然兩個函數功能有所差異,但在同樣情況下推薦使用`empty()`
10. `isfile/file_exists`兩個函數的功能有所不同,`file_exists`既可判斷文件是否存在,也可以判斷目錄是否存在,在同樣的情況下推薦使用`is_file`
## 文件
1. 減少文件包含數,減少磁盤`IO`
2. 使用完整路徑,或者容易轉換的相對路徑。避免在`include_path`查找
3. 文件的代碼行數不要超過2000行
4. `require_once/include_once`效率低于`require/include`,需要額外的去查看系統是否已經調用過這個文件,因為它們在一個`opcode`緩存下的調用非常慢。
5. 程序執行文件用`require/require_once`,緩存文件用`include/include_once`。`include`效率好于`require`。
6. 優化`spl`中的文件自動加載機制,參考`YII`
7. 類庫文件加載,是否考慮類是否已實例化,可考慮采用設計模式之單例模式
8. 文件讀寫的并發性
## 面向對象
1. 控制實例的創建的數量
2. 優先使用常量、類常量
3. 優先使用靜態變量,靜態屬性
4. 類的結構合理
5. 面向接口編程
6. 封裝變化點
7. 依賴于抽象,不依賴于細節
8. 優先使用靜態成員
9. 類的接口清晰穩定,類的職責單一,類與類的通信合理
10. 使用常量的好處:編譯時解析,沒有額外的開銷,雜湊表更小,所以內部查找更快,類常量僅存在于特定的【命名空間】,所以雜湊名更短,代碼更干凈,使除錯更方便
## 字符串
> 用單引號替代雙引號引用字符串;避免檢索字符串中的變量
## 運算
1. 用`i += 1`代替`i = i + 1`,符合`C/C++`的習慣,效率還高
## 數組
> 多維數組盡量不要循環嵌套賦值
## 判斷
1. 邏輯判斷優先使用`switch`,對于業務邏輯相對較多情況請選擇`if/else`,提高代碼的可讀性
2. 盡量控制`if/else`判斷的個數,如果太多請考慮功能優化或代碼優化,或使用三元運算符
3. 盡量使用恒等于用于比較判斷,恒等的效率高于等于,而且還能避免一些類型強制轉換的錯誤
4. `if/else`與`&&`單條語句判斷請選擇`&&`的形式,它的效率高于`if/else`,如下:
~~~
?if ($a == 1) {
? ? ?$b = 2;
?}
?// 優化
?($a == 1) && $b = 2;
~~~
## 緩存
1. 使用`PHP`緩存,緩沖`opcode`
2. 使用`memcache/nosql`
3. 使用內存數據庫
4. 使用文件緩存
5. 緩沖功能
## 其他
1. 少用`@`符號,嚴重影響性能
2. 適時關閉遠程資源連接如數據庫,`ftp`,`socket`等,適時清理這些資源
## 性能檢測工具
1. `Web Server`
2. `ab`
3. `http_load`
4. `xdebug`
- PHP獲取客戶端瀏覽器信息和版本
- PHP獲取客戶端操作系統信息
- 無限級分類
- git使用
- 權限檢測思路
- Vue學習
- 遇到的一些問題
- PHP的編碼思維和技巧
- mysql復習
- tp5
- ThinkPHP5.x 公共函數
- TP5登錄注冊
- TP5使用模板繼承
- ThinkPHP5.1 清除緩存
- thinkphp5實現安裝程序
- 安全
- tp中實現跨域代碼
- ThinkPHP5.1配合pjax實現菜單欄無刷新跳轉
- 獲取數據庫版本和數據庫大小
- 模型的基本CURD操作
- 商品spu
- 全局異常處理類
- ExceptionHandler
- BaseException
- PHP函數之error_reporting(E_ALL ^ E_NOTICE)詳細說明
- 微信小程序
- wx:for
- tp6
- 分離的一些模塊
- session開啟
- Spring
- 依賴注入
- 數據結構
- 二叉樹
- js獲取地址欄變量
- PHP設計模式
- 面向對象
- PHP1
- PHP性能優化
- Java學習
- static關鍵字
- 多態
- 接口、階乘
- 大佬給的面試題
- 訪問量為5000萬的博客系統設計
- PHP可變參數
- Nginx的配置案例
- 求數組中的最大值,并返回數組索引
- PHP面試方向
- PHP數組工具類ArrUtil
- 字符串工具類StrUtil
- PHP使用curl發送請求
- mysql
- PHP上傳base64圖片處理函數
- webstorm小程序常用配置
- 郵箱正則表達式
- leetcode mysql記錄
- 函數庫