Я запускаю PHP версии 5.3.0 и Apache: 2.2.11
Когда я запускаю скрипты PHP, которые потребляют много памяти (я думаю) – большие циклы и т. Д. Мой веб-сервер Apache сообщает об аварии!
[Sat Jan 02 00:51:30 2010] [notice] Parent: child process exited with status 255 -- Restarting.
Нужно ли мне где-то увеличивать память? В настоящее время у меня установлена память
memory_limit = 512M
PHP не жаловался на это, поэтому я думаю о чем-то другом?
Спасибо всем
Эта ошибка была зарегистрирована моей машиной Windows в средстве просмотра событий:
Неверное приложение httpd.exe, версия 2.2.11.0, отметка времени 0x493f5d44, ошибка модуля php5ts.dll, версия 5.3.0.0, отметка времени 0x4a4922e7, код исключения 0xc0000005, смещение ошибки 0x00083655, идентификатор процесса 0x1588, время начала приложения 0x01ca8b46e4925f90.
Сценарий в вопросе. Я удалил URL.
<?php error_reporting(E_ALL); set_time_limit(300000); echo 'start<br>'; include_once('simple_html_dom.php'); $FileHandle = fopen('tech-statistics3.csv', 'a+') or die("can't open file"); for($i =1; $i < 101; $i ++){ // Create DOM from URL $html = file_get_html("http://www.x.com/$i"); foreach($html->find('div[class=excerpt]') as $article) { $item0 = $article->children(1)->children(1)->children[0]->plaintext; $item1 = $article->children(1)->children(1)->children[0]->plaintext; $item2 = $article->children(1)->children(0)->children(0)->children(0)->plaintext; //$item3 = $article->children(1)->children(0)->children(0)->children[1]->children(0)->next_sibling(); $stringa = trim($item0).",".trim($item1).",".trim($item2)."\r\n"; fwrite($FileHandle, $stringa); echo $stringa.'<br>'; echo '------------>'.$i; } } fclose($FileHandle); echo '<b>End<br>'; ?>
Я использую PHP Simple HTML DOM Parser, и я только что нашел это:
http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak
Я думаю, что я должен очистить память, иначе он потерпит крах. Тестирование сейчас.
Да, это была утечка памяти! 🙂
Apache рушился из-за утечки памяти, которая была вызвана не закрытием ресурса, который использовался снова и снова в цикле for, а также скрипт, использующий рекурсию.
Спасибо всем за помощь.
Я столкнулся с этим сегодня, анализируя тонну HTML в цикле. Вот простое исправление:
$dom = file_get_html("http://www.x.com/$i"); ... // parse your DOM $dom->clear() // clear before next iteration
Просто вызывая метод clear () для объекта dom, когда я был сделан на каждой итерации, он очистил его для меня.
Немного поздно для вечеринки, но я столкнулся с той же проблемой с ошибкой сегментации при использовании Simple HTML DOM. Я уверен, что использую $ html-> clear (); и unset ($ html); чтобы очистить HTML-код, который я загрузил, но я все еще получал ошибку с ошибкой сегментации во время большой царапины данных.
Я обнаружил, что мне нужно прокомментировать какой-то ясный код в файле simple_html_dom.php. Найдите функцию clear () в классе simple_html_dom_node и закомментируйте все внутри;
function clear() { // These were causing a segmentation fault... // $this->dom = null; // $this->nodes = null; // $this->parent = null; // $this->children = null; }
Я столкнулся с такими проблемами, как PHP с Apache в Windows. Вместо того, чтобы сообщать какую-либо полезную информацию на экран, процесс просто умирает. Если это вообще возможно, я бы предложил запустить ваш код в linux box с Apache и PHP. По моему опыту, эта комбинация будет сообщать об этом как об ошибке памяти, тогда как в Windows ничего не происходит вообще. Я видел это только с рекурсией.
Вы не используете рекурсию? Я видел ошибку PHP и убил дочерний Apache без какого-либо полезного вывода журнала, когда происходит бесконечная рекурсия.