php优化
2015年12月14日 21:20:29
之前写过两篇文章:
第二篇里边有两个很耗时间和内存的线条:
第一个斜坡:
从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 }