рекурсивная функция возврата PHP Допустимый объем памяти исчерпан - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю над небольшим проектом DOM, чтобы получить динамические ссылки и статические ссылки. но моя функция выполняется много времени и выдает ошибку, как вы видите

allowed memory size of bytes exhausted

это мой код PHP:

public $domain_name = 'www.example.com'; 
public function dynamic_url2($url = "http://www.example.com"){
    $pages = array();
    $html = file_get_html($url);
    foreach($html->find('a') as $page){
        if(valid_url($page->href)){
            $parse_page = parse_url($page->href);
            if($parse_page['host'] == $this->domain_name){
                if(!in_array($page->href, $pages)){
                    $pages[] = $page->href;
                    if(array_key_exists('query', $parse_page))
                        echo 'contain dynamic parameters : '. $page->href.'<br>';
                    else
                        echo 'not dynamic : '. $page->href.'<br>';
                }
                return $this->dynamic_url2($page->href);
            }
        }
    }
}

моя функция верна? как я могу оптимизировать его?

спасибо

1 Ответ

0 голосов
/ 10 ноября 2018

Помимо некоторых небольших корректировок, которые я сделал во время тестирования, вам нужно только сделать $pages модифицируемым (через &$pages в объявлении функции) и передавать массив $pages при каждом рекурсивном вызове.

public $domain_name = 'https://www.example.html'; 
public function dynamic_url2($url, &$pages = []){
    //echo "<div>Crawling $url</div>";
    $dom = new DOMDocument;
    libxml_use_internal_errors(true);  // for malformed html warning suppression
    $dom->loadHTML(file_get_contents($url));  // this doesn't account for relative urls
    $xpath = new DOMXPath($dom);
    foreach ($xpath->query("//a") as $a) {
        $href = $a->getAttribute('href');
        //echo "<div>Found $href @ $url</div>";
        if (valid_url($href)) {
            $parsed = parse_url($href);
            if ($parsed['host'] == $this->domain_name && !in_array($href, $pages)) {
                $pages[] = $href;
                //echo "<div>$href is " , (array_key_exists('query', $parsed) ? '' : 'not ') , 'dynamic</div>';
                $this->dynamic_url2($href, $pages);
            } else {
                //echo "<div>Ignored url: $href</div>";
            }
        } else {
            //echo "<div>Invalid url: $href</div>";
        }
    }
    return $pages;    
}
var_export($this->dynamic_url2($this->domain_name));
...