php優化

myDCool發表於2015-12-14

2015年12月14日 21:20:29

之前寫過兩篇文章:

xdebug配置

xdebug trace 結果分析

第二篇裡邊有兩個很耗時間和記憶體的線條: 

第一個斜坡:

從mysql裡讀取資料後, 用while迴圈呼叫$result->fetch_assoc()將資料存放到陣列裡

這裡的缺點是迴圈呼叫該函式, 如果資料量比較大的話,會有很多的函式呼叫(上下文切換),很浪費效率

優化:

php原始碼安裝.configure時指定mysqlnd驅動,老版本php原始碼安裝時需要指定mysql安裝的相關幾個地址

確保這一項以後, 使用$result->fetch_all(MYSQLI_ASSOC) 一次性將result轉換為關聯陣列

 1 //將結果集轉換成陣列返回
 2     //如果field不為空,則返回的陣列以$field為鍵重新索引
 3     public function rstoarray(&$result, $field = ``)
 4     {
 5         $arrRs = $result->fetch_all(MYSQLI_ASSOC); //該函式只能用於php的mysqlnd驅動
 6         $result->free();
 7         
 8         if ($field) {
 9             $arrResult = [];
10             foreach ($arrRs as $v) {
11                 $arrResult[$v[$field]] = $v;
12             }
13             return $arrResult;
14         }
15         
16         return $arrRs;
17     }

 

圖中有一個水平線,記憶體沒有增加,但是耗費了很多時間

那裡的程式碼是一段排序操作,用到了php的usort(); 自定義排序,

需要自己寫一個排序用的回撥函式, 這段效率特別低

優化:

[

`a` => [`sort` => 123],

`b` => [`sort` => 234]

…..

]

先遍歷要排序的二維陣列(如上邊的那個), 生成一個一維陣列, 鍵為二維陣列的鍵,值為排序用的那個值:

[

`a` => 123,

`b` => 234

]

然後用php的排序函式: asort() 或者 arsort();對這個一維陣列排序, 然後根據對應關係生成一個新的完整的陣列, 這樣會快很多

 1 //按照二維陣列中的某個鍵進行排序
 2     public function mysort(&$arr, $key, $desc = ``)
 3     {
 4         $tmp = array();
 5         foreach ($arr as $k=>$v) {
 6             $tmp[$k] = $v[$key];
 7         }
 8         
 9         if ($desc) {
10             arsort($tmp);
11         } else {
12             asort($tmp);
13         }
14         
15         $result = array();
16         foreach ($tmp as $k => $v) {
17             $result[$k] = $arr[$k];
18         }
19         
20         return $result;
21     }

 

SummerPHP 框架


相關文章