tags:

views:

388

answers:

3

Hello all,

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 set 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! :)

A: 

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.

Rob
It's likely that recursion would actually increase the amount of memory consumed, since a stack frame would need to be stored for each call(it doesn't look like PHP supports tail recursion).
Mike
I am using recursion and a lot of stuff is being held in memory. This script will be on some good hardware, I am wondering what I should increase temporarily to get the script to finish?
Abs
A: 

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.

notJim
`exception code 0xc0000005` means "Access violation" which tells you as much or as little as "Segmentation fault" on a linux machine ;-)
VolkerK
Right, my point was that on a linux machine, PHP would catch the error, rather than just dying a fiery death. Anyway, it looks like they solved the problem.
notJim
+1  A: 

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.

Abs