使用simple_dom_html导致内存不足

时间:2015-12-02 08:52:58

标签: php curl out-of-memory simple-html-dom

我遇到上述错误的问题。我确信我在之前的主题中尝试了一些方法,但没有解决。

我正在解决与curl和simple_dom_html相关的算法。我使用了很多递归函数和foreach来重复初始化simple_dom_html。想象一下上述所有步骤在一天或更长时间内运行。但是当你运行它突然停止并且没有显示任何错误消息。我试着检查php_errors_log并发现:

  

- PHP致命错误:行内(1148,1451,1396,......)的simple_html_dom.php内存不足(分配1,843,920,896)(试图分配24个字节)

我不怀疑我的代码有问题,因为我试图以有限的方式运行,它的成功。示例:我有大约10000页,它运行大约5%!然后,它不再运行。我尝试了很多方法:

 - $domHtml->clear(), unset($domHtml), $domHtml = ''
  • 配置代码:
  

ini_set('memory_limit', - 1);       ini_set('max_execution_time', - 1);       ini_set('max_input_time', - 1);

  • 或像上面的php.ini中的配置
  • 我用苏格兰威士忌尝试流浪汉,但也不行。

以下是我的示例代码:

/**
     * Create new Curl
     * @return 
     */
    private function initCurl($url = null) 
    {
        $ch = curl_init();
        $this->autoSetOpt($ch, $url);
        return $ch;
    }


    /**
     * Auto set Option. This is demo
     * @return
     */
    private function autoSetOpt($ch, $url = null) 
    {
        curl_setopt($ch, CURLOPT_URL, trim($url));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate");
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT  , 20);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    }


    /**
     * Execute curl function
     * @return 
     */
    private function exec_curl($ch) 
    {
        return curl_exec($ch);
    }

    /**
     * Close Curl
     * @return
     */
    public function close($ch) 
    {
        curl_close($ch);
    }



public function scanTrackInList($arrTracks = array(), $arrLink = array(), $type = 'song')
    {

        if (empty($arrLink[0])) {
            $link = $arrLink[1];
        } else {
            $link = $arrLink[0];
        }
        $ch = $this->initCurl($link);
        $domHtml = str_get_html($this->exec_curl($ch));
        $this->close($ch);
        unset($ch);

        if ($domHtml) {
            if (count($domHtml->find('html',0)) > 0) {
                if ($type == 'song') {
                    $index = '.list-item h3.txt-primary a';
                } else {
                    $index = '.album-item h3.title-item a';
                }
                foreach($domHtml->find($index) as $element) {
                    if ($this->detectZingMp3Url($element->href)) {
                        $arrOb = $this->getObjectTrack($element->href);
                        if ($arrOb) {
                            $arrDetail = array();
                            if ($arrOb[0]->type == 'mp3') {

                                $arrDetail = $this->getDetailSong($element->href);
                            } elseif ($arrOb[0]->type == 'video') {
                                $arrDetail = $this->getDetailSong($element->href);
                            }
                            if (!$arrOb || !$arrDetail) {
                                return $this->scanTrackInList($link, $arrLink, $count);
                            }
                            $arrTracks[] = array_merge($arrOb, $arrDetail);
                        }
                    }
                }


                $domHtml->clear();
                unset($domHtml);


                array_splice($arrLink,0,1);

            } else {
                $domHtml->clear();
                unset($domHtml);



                return $this->scanTrackInList($arrTracks, $arrLink, $type, $count);
            }
        } else {


            return $this->scanTrackInList($link, $arrLink, $count);
        }   

        if (count($arrLink) > 0) {         

            return $this->scanTrackInList($arrTracks,$arrLink, $type, $count + 1);
        }

        return $arrTracks;
    }

使用:

  • $ arrTracks:我的结果

  • $ arrLink:网址集将会运行。

  • $ type:不关心它。只需输入歌曲或视频。

这只是一小步。我有2-3次。而且运行时不可预测。可能需要几天时间。

请帮帮我!告诉我你是否有任何解决方案。谢谢大家!

0 个答案:

没有答案