您的位置:首页 > 编程语言 > PHP开发

php优化

2015-12-14 21:56 483 查看
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转换为关联数组

//将结果集转换成数组返回
//如果field不为空,则返回的数组以$field为键重新索引
public function rstoarray(&$result, $field = '')
{
$arrRs = $result->fetch_all(MYSQLI_ASSOC); //该函数只能用于php的mysqlnd驱动
$result->free();

if ($field) {
$arrResult = [];
foreach ($arrRs as $v) {
$arrResult[$v[$field]] = $v;
}
return $arrResult;
}

return $arrRs;
}


图中有一个水平线,内存没有增加,但是耗费了很多时间

那里的代码是一段排序操作,用到了php的usort(); 自定义排序,

需要自己写一个排序用的回调函数, 这段效率特别低

优化:

[

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

'b' => ['sort' => 234]

.....

]

先遍历要排序的二维数组(如上边的那个), 生成一个一维数组, 键为二维数组的键,值为排序用的那个值:

[

'a' => 123,

'b' => 234

]

然后用php的排序函数: asort() 或者 arsort();对这个一维数组排序, 然后根据对应关系生成一个新的完整的数组, 这样会快很多

//按照二维数组中的某个键进行排序
public function mysort(&$arr, $key, $desc = '')
{
$tmp = array();
foreach ($arr as $k=>$v) {
$tmp[$k] = $v[$key];
}

if ($desc) {
arsort($tmp);
} else {
asort($tmp);
}

$result = array();
foreach ($tmp as $k => $v) {
$result[$k] = $arr[$k];
}

return $result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: