开发者

PHP Out of Memory - Crashes Apache?

I am running PHP version 5.3.0 and Apache: 2.2.11

When I run PHP scripts that consume a lot of memory (I think) - large loops etc. My Apache web server reports a crash?!

[Sat Jan 02 00:51:30 2010] [notice] Parent: child process exited with status 255 -- Restarting.

Do I need to increase memory somewhere? I currently have memory s开发者_运维问答et to

memory_limit = 512M 

PHP hasn't complained about this so I am thinking its something else?

Thanks all

Update

This error has been logged by my windows machine in the event viewer:

Faulting application httpd.exe, version 2.2.11.0, time stamp 0x493f5d44, faulting module php5ts.dll, version 5.3.0.0, time stamp 0x4a4922e7, exception code 0xc0000005, fault offset 0x00083655, process id 0x1588, application start time 0x01ca8b46e4925f90.

Update 2

Script in question. I've removed the 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>';

?>

Update 3

I am using the PHP Simple HTML DOM Parser and I have just found this:

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

I think I should be clearing memory otherwise it will crash. Testing now.

Update4

Yep, it was a memory leak! :)


Apache was crashing due to a memory leak which was caused by not closing a resource that was being used again and again in a for loop, as well as the script making use of recursion.

Thanks all for the help.


I ran into this today when parsing a ton of HTML in a loop. Here is the simple fix:

$dom = file_get_html("http://www.x.com/$i");
... // parse your DOM
$dom->clear() // clear before next iteration

Just calling the clear() method on the dom object when I was done in each iteration cleared it up for me.


A bit late to the party, but I've been running into the same issue with a Segmentation Fault when using Simple HTML DOM. I'm making sure I'm using $html->clear(); and unset($html); to clear down the HTML I've loaded in, but I was still receiving the Segmentation Fault error during a large scrape of data.

I found that I needed to comment out some clear code in the simple_html_dom.php file. Look for function clear() within the simple_html_dom_node class, and comment out everything inside;

    function clear() {
            // These were causing a segmentation fault...
            // $this->dom = null;
            // $this->nodes = null;
            // $this->parent = null;
            // $this->children = null;
    }


I've run into problems like these using PHP with Apache on Windows. Rather than reporting any useful information to the screen, the process simply dies. If at all possible, I would suggest running your code on a linux box with Apache & PHP. In my experience, that combination will generally report this as a memory error, whereas on Windows, nothing seems to happen at all. I've only seen this happen with recursion by the way.


You're not using recursion? I've seen PHP bug out and kill the Apache child without any useful logging output when infinite recursion occurs.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜