php 内存管理 本帖最后由 zmzkkk 于 2012-10-31 16:13:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 每次添加完数据把不用的变量都UNSET掉,这些垃圾数据占用你的内存 curl采集么,循环中,curl有释放么? CURL 采集是写在一个方法,传入URL 返回 字符串 每次循环结束的地方把不需要的全部unset,然后和循环开始的地方的memory usage比较, 一直到基本一样这是个慢慢调试的活gc_collect_cycles基本无用, 因为你不显式调用垃圾收集也会进行 现在用了 sleep(1)解决。 每个循环 最后加一个 sleep(1) 观察内存占用,很正常,楼上的方法没有试过, 下次试一下。 sleep 还是减缓程序的运行,与内存占用毫无关系你最好贴出你的核心代码,以便帮你分析 建议你用shell来解决这个问题:大概解决办法是exec(xx.php,$args);这样每次exec运行完后,直接释放掉xx.php文件占用的资源 public function itunesClass4(){ set_time_limit(0); //echo number_format(memory_get_usage()); //exit; $test = M('test'); //Thinphp 数据库操作 $aClass = M('AudioClass'); $audio = M('Audio'); $audio->query('set names UTF8'); $list = $aClass->where('`IsDelete`=0 and `Pid`>0 and `id`>=4045 and `Level`=3' )->select(); //找到需要采集的页面URL //print_r($list); //exit; foreach($list as $k=>$v){ //开始循环 采集 $str = $this->curlHtml($v['Url']); // CURL 获取到 字符串 // 正则 取到想要的东西 由于想要的东西比较乱, pre_match_all 了好几次 preg_match_all('/audio-preview-url="(.*mp3)".*adam-id="([^"]+)"/isU', $str, $arr); //mp3 preg_match_all('/<span><span class="text">([\d]{1,2}+\/[\d]{1,2}\/[\d]{1,2})<\/span>/isU',$str,$darr); //日期 if(!empty($arr[1])){ $row = array(); //用一个数组来保存最后想要入库的数据 foreach($arr[1] as $kk=>$vv){ $row['mp3'][] = $vv; preg_match_all('/__desc_popup_d_'.$arr[2][$kk].'={"title":"([^"]*)".*description":"(.*)"release_date"/isU',$str,$tarr); if(!empty($tarr[1])){ $row['title'][] = stripcslashes($tarr[1][0]); $tdsp = trim($tarr[2][0]); $tdsp = trim($tdsp,','); $tdsp = trim($tdsp,'"'); $row['description'][] = stripcslashes($tdsp); } } }else{ //表示这个URL 没有找到想要的内容,把这个URL 设置为删除 $data['IsDelete']=1; $aClass->where(array('id'=>$v['id']))->save($data); } if(!empty($row)){ //开始入库。 foreach ($row['title'] as $rk=>$rv){ $data['class_id']=$v['id']; $data['title']=$rv; $data['Description']=$row['description'][$rk]; $data['Released']=isset($darr[1][$rk])?$darr[1][$rk]:''; $data['Mp3Url'] = $row['mp3'][$rk]; $inid = $audio->add($data); unset($data); //下面是自己写的记录 内存使用量 $data['aid'] = $inid; $data['mem'] = number_format(memory_get_usage()); $data['AddTime'] = time(); $test->add($data); } } unset($data); unset($row); unset($tarr); unset($arr); unset($darr); unset($str); usleep(100000); } }PS: TP 中由于不知道怎么批量插入数据,我是一条一条数据插入。 下面是我CRUL 采集的方法。 private function curlHtml($posturl){ $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch,CURLOPT_URL, $posturl); curl_setopt($ch,CURLOPT_HEADER,false); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); $str = curl_exec($ch); curl_close($ch); return $str; } 可以这样来做,把$list循环下所有的代码写到一个另一个php文件中,然后用shell 后台直接就可以了, 本机是 WINDOW 没有 SHELL 先把循环体内tp的几个操作,包括读取写入,注释掉,以确认不是tp的问题 小巧php cms 二次开发 求一个分页显示读入的大txt文件 哪位好心人能给点php实例 我写了一个网页在appserv里面能正常打开,在wampserver里面却不行,求解怎么重写代码 我想找一个PHP相册程序的源码 求高手帮忙调试下程序(2个文件),不知道哪里错了 请高手把这个ASP.net翻译成PHP PHP认证码 求教高手,给一个地方门户网站源码,带后台操作的! php和web前端有什么区别,分别有什么特点 我的xampp到底哪里出了问题啊。请各位大神帮帮忙啊 如何获取真正的连接地址
然后和循环开始的地方的memory usage比较, 一直到基本一样这是个慢慢调试的活gc_collect_cycles基本无用, 因为你不显式调用垃圾收集也会进行
大概解决办法是exec(xx.php,$args);
这样每次exec运行完后,直接释放掉xx.php文件占用的资源
set_time_limit(0);
//echo number_format(memory_get_usage());
//exit;
$test = M('test'); //Thinphp 数据库操作
$aClass = M('AudioClass');
$audio = M('Audio');
$audio->query('set names UTF8');
$list = $aClass->where('`IsDelete`=0 and `Pid`>0 and `id`>=4045 and `Level`=3' )->select(); //找到需要采集的页面URL
//print_r($list);
//exit;
foreach($list as $k=>$v){ //开始循环 采集 $str = $this->curlHtml($v['Url']); // CURL 获取到 字符串
// 正则 取到想要的东西 由于想要的东西比较乱, pre_match_all 了好几次
preg_match_all('/audio-preview-url="(.*mp3)".*adam-id="([^"]+)"/isU', $str, $arr); //mp3
preg_match_all('/<span><span class="text">([\d]{1,2}+\/[\d]{1,2}\/[\d]{1,2})<\/span>/isU',$str,$darr); //日期
if(!empty($arr[1])){
$row = array(); //用一个数组来保存最后想要入库的数据
foreach($arr[1] as $kk=>$vv){
$row['mp3'][] = $vv;
preg_match_all('/__desc_popup_d_'.$arr[2][$kk].'={"title":"([^"]*)".*description":"(.*)"release_date"/isU',$str,$tarr);
if(!empty($tarr[1])){
$row['title'][] = stripcslashes($tarr[1][0]);
$tdsp = trim($tarr[2][0]);
$tdsp = trim($tdsp,',');
$tdsp = trim($tdsp,'"');
$row['description'][] = stripcslashes($tdsp);
}
}
}else{ //表示这个URL 没有找到想要的内容,把这个URL 设置为删除
$data['IsDelete']=1;
$aClass->where(array('id'=>$v['id']))->save($data);
}
if(!empty($row)){ //开始入库。
foreach ($row['title'] as $rk=>$rv){
$data['class_id']=$v['id'];
$data['title']=$rv;
$data['Description']=$row['description'][$rk];
$data['Released']=isset($darr[1][$rk])?$darr[1][$rk]:'';
$data['Mp3Url'] = $row['mp3'][$rk];
$inid = $audio->add($data);
unset($data);
//下面是自己写的记录 内存使用量
$data['aid'] = $inid;
$data['mem'] = number_format(memory_get_usage());
$data['AddTime'] = time();
$test->add($data);
}
}
unset($data);
unset($row);
unset($tarr);
unset($arr);
unset($darr);
unset($str);
usleep(100000);
}
}
PS: TP 中由于不知道怎么批量插入数据,我是一条一条数据插入。 下面是我CRUL 采集的方法。 private function curlHtml($posturl){
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch,CURLOPT_URL, $posturl);
curl_setopt($ch,CURLOPT_HEADER,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$str = curl_exec($ch);
curl_close($ch);
return $str;
}