dom — рекурсивная функция PHP возвращает допустимый объем памяти исчерпан

Я работаю над небольшим проектом 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

Решение

Помимо некоторых незначительных корректировок, которые я сделал во время тестирования, вам нужно только сделать $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));
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector