重复调用函数导致内存不足

qq_1233211234567 2018-09-14 11:32:03

public function mh_all_img($id=140000,$limit=1000,$loop=0,$errurl=false,$continue=false)
{
$data = ChpModel::where(['id'=>['BETWEEN',[$id,$id+$limit]]])->column('id,comic_id,name,pl_index_url,img');
if ($id>252000) {
echo "done";
exit;
}
if (!$data) {
$id = $id+($limit*4);
unset($data);
$this->mh_all_img($id);
}
try {
$ql = $this->ql;
$ql->use(PhantomJs::class,'C:/wamp64/www/mh/vendor/phantomjswin/bin/phantomjs.exe');
if ($errurl) {
unset($errid);
$errid = 0;
foreach ($data as $key => $value) {
if ($value['pl_index_url'] == $errurl) {
if ($continue) {
$errid = $data[$key+1]['id'];
}else{
$errid = $value['id'];
}
}
}
foreach ($data as $key => $value) {
if ($value['id'] < $errid) {
unset($data[$key]);
}
}
}
foreach ($data as $key => $value) {
if ($value['img']) {
continue;
}
unset($imgs);
$imgs = [];
unset($url);
$url = $this->pl_domin.$value['pl_index_url'];
$imgs = $ql->browser($url,false,['--load-images'=>'false'])->rules([
'img' => ['#page_select>option','value'],
])->query()->getData()->all();
if (!$imgs) {
$str = $value['pl_index_url'];
throw new Exception($str);
}
$img = '';
foreach ($imgs as $k => $v) {
$img .= $v['img'].';';
}
$imgs = $ql->browser('about:blank')->query()->getData();
unset($imgs);
ChpModel::where('id',$value['id'])->update(['img'=>$img]);
unset($img);
}
unset($url);
unset($data);
unset($imgs);
unset($ql);
$id = $id+($limit*4);
$this->mh_all_img($id);
} catch (Exception $e) {
sleep(3);
$msg = $e->getMessage();
unset($url);
unset($data);
unset($imgs);
unset($ql);
$url = $msg;
Pl_error_logModel::create(['act'=>__FUNCTION__,'detail'=>$msg.'---id:'.$id]);
unset($msg);
$loop = $loop+1;
if ($loop>5) {
Pl_error_logModel::create(['act'=>__FUNCTION__,'detail'=>'loop out'.'---url:'.$url]);
$this->mh_all_img($id,$limit,0,$url,true);
}else{
$this->mh_all_img($id,$limit,$loop,$url);
}
}
}

大概就是根据数据库采集然后更新数据,数据库有20多万条,运行3,4个小时候就会内存不足,每次重新调用大概会多1Mb占用,请问要怎么解决
...全文
195 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_1233211234567 2018-09-14
  • 打赏
  • 举报
回复
额,你的意思是把数据一次性处理完吗?不太懂,我这样写就想着分段处理好点?
xuzuning 2018-09-14
  • 打赏
  • 举报
回复
为什么要递归调用呢?
数据库中本是平面的数据,为何要立体化呢?
xuzuning 2018-09-14
  • 打赏
  • 举报
回复
77、79行的 $this->mh_all_img($id,$limit,0,$url,true); 不是递归调用吗?
是一次性全处理完,并非分段处理
分段处理是
$this->mh_all_img($id,$limit,0,$url,true);
$this->mh_all_img($id+$limt,$limit,0,$url,true);
$this->mh_all_img($id+$limt*2,$limit,0,$url,true);
...

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧