PHP内存不足 - 崩溃Apache?

时间:2010-01-02 00:59:28

标签: php apache memory

我正在运行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。

更新2

有问题的剧本。我删除了网址。

<?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>';

?>

更新3

我正在使用PHP Simple HTML DOM Parser,我刚刚发现了这个:

http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak

我想我应该清理内存,否则会崩溃。现在测试。

UPDATE4

是的,这是内存泄漏! :)

5 个答案:

答案 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子进程。