foreach ($arr as $key => $value) {
$res = $this->querydata($value);
$data = array('res'=>$res);
M('test')->add($data);
}
如上demo,$res会获取到一个很大的数据,然后存入数据库中,这个foreach循环次数很多,而且每次循环我都没有unset($res),因为我认为重复赋值不会重新消耗内存。。。但好像被打脸,报错了:
说超出内存限制128M了。。。请教大神foreach中一个变量的重复赋值会不会一直消耗内存? ( ps: querydata()这个方法有用到curl请求,在这个循环里也就是不断的请求数据)
更新:真实完整代码如下
// 获取到最新分页的酒店id
$arr = $this->queryHotelIdList();
if($arr['retrunCode'] == '000'){
for($i=$play['cur_page'];$i<=$arr['bussinessResponse']['totalPage'];$i++){
$page = $i;
$arr = $this->queryHotelIdList($page);
M('play')->where("id={$play['id']}")->save(array('cur_page'=>$page));
// 将1000个id的数组拆分100个10个为一组的二维数组
$ten_arr = array_chunk($arr['bussinessResponse']['hotelIds'], 10);
// 循环这个二维数组,每一次循环获取10家酒店的基本信息,转json存为一条记录
foreach ($ten_arr as $key => $value) {
$res = $this->queryHotelInfo($value);
if($res['retrunCode'] == '000'){
$data = [];
$data['page'] = $page;
$data['json_data'] = json_encode($res['bussinessResponse']['hotelInfos']);
$titan_data_model->add($data);
unset($data);
}else{
// 失败则将这10个酒店id记录下来
$failed_ids = implode(',',$value);
$data = [];
$data['hotel_ids'] = $failed_ids;
$data['error_msg'] = $res['retrunMsg'];
$data['page'] = $page;
$titan_fail_hotel_ids_model->add($data);
}
unset($res);
$memory = memory_get_usage();
echo intval($memory/1024);
echo "<br>";
ob_flush();
flush();
}
// 睡眠30秒,以保证不超过300/分钟的请求次数限制
sleep(30);
}
}
里面的queryHotelIdList和queryHotelInfo都是一个封装好的curl请求,返回一个较大的数据,但不会超过1M
前段时间遇到一个无限级分类的问题,为了避免一直消耗内存,赋值过之后的变量就用unset销毁了.