本帖最后由 zmzkkk 于 2012-10-31 16:13:59 编辑

解决方案 »

  1.   

    每次添加完数据把不用的变量都UNSET掉,这些垃圾数据占用你的内存
      

  2.   

    curl采集么,循环中,curl有释放么?
      

  3.   

    CURL 采集是写在一个方法,传入URL 返回 字符串
      

  4.   

    每次循环结束的地方把不需要的全部unset,
    然后和循环开始的地方的memory usage比较, 一直到基本一样这是个慢慢调试的活gc_collect_cycles基本无用, 因为你不显式调用垃圾收集也会进行
      

  5.   

    现在用了   sleep(1)解决。     每个循环 最后加一个  sleep(1)  观察内存占用,很正常,楼上的方法没有试过, 下次试一下。
      

  6.   

    sleep 还是减缓程序的运行,与内存占用毫无关系你最好贴出你的核心代码,以便帮你分析
      

  7.   

    建议你用shell来解决这个问题:
    大概解决办法是exec(xx.php,$args);
    这样每次exec运行完后,直接释放掉xx.php文件占用的资源
      

  8.   

    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;
    }
      

  9.   

    可以这样来做,把$list循环下所有的代码写到一个另一个php文件中,然后用shell  后台直接就可以了,
      

  10.   

    本机是 WINDOW  没有 SHELL
      

  11.   

    先把循环体内tp的几个操作,包括读取写入,注释掉,以确认不是tp的问题