我正在运行PHP版本5.3.0和Apache:2.2.11
当我运行消耗大量内存的PHP脚本时(我认为) - 大型循环等我的Apache Web服务器报告崩溃了?!
[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, 进程ID 0x1588,应用程序启动 时间0x01ca8b46e4925f90。
有问题的剧本。我删除了网址。
<?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
我想我应该清理内存,否则会崩溃。现在测试。
答案 0 :(得分:2)
Apache由于内存泄漏导致崩溃,这是因为没有关闭在for循环中一次又一次使用的资源,以及使用递归的脚本。
感谢大家的帮助。
答案 1 :(得分:2)
今天我在循环中解析大量HTML时遇到了这个问题。这是一个简单的修复:
$dom = file_get_html("http://www.x.com/$i");
... // parse your DOM
$dom->clear() // clear before next iteration
在每次迭代完成后,只需在dom对象上调用 clear()方法就可以为我清除它。
答案 2 :(得分:2)
派对有点晚了,但在使用Simple HTML DOM时,我遇到了与分段错误相同的问题。我确定我正在使用$ html-&gt; clear();和未设置($ html);清除我加载的HTML,但是在大量数据中我仍然收到了Segmentation Fault错误。
我发现我需要在simple_html_dom.php文件中注释掉一些明确的代码。在simple_html_dom_node类中查找函数clear(),并注释掉其中的所有内容;
function clear() {
// These were causing a segmentation fault...
// $this->dom = null;
// $this->nodes = null;
// $this->parent = null;
// $this->children = null;
}
答案 3 :(得分:1)
我在Windows上使用PHP和Apache遇到了类似的问题。该过程不是向屏幕报告任何有用的信息,而是简单地死亡。如果可能的话,我建议在Apache和Linux的Linux机器上运行你的代码。 PHP。根据我的经验,这种组合通常会将此报告为内存错误,而在Windows上,似乎根本没有发生任何事情。顺便说一句,我只看到这种情况发生在递归上。
答案 4 :(得分:0)
你没有使用递归?我发现了PHP错误并在发生无限递归时杀死了没有任何有用日志输出的Apache子进程。