Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you debug php "Out of Memory" issues?

I've had some issues lately with PHP memory limits lately:

Out of memory (allocated 22544384) (tried to allocate 232 bytes)

These are quite the nuisance to debug since I'm not left with a lot of info about what caused the issue.

Adding a shutdown function has helped

register_shutdown_function('shutdown'); 

then, using error_get_last(); I can obtain information about the last error, in this case, the "Out of memory" fatal error, such as the line number, and the php file name.

This is nice and all, but my php program is heavily object oriented. An error deep in the stack doesn't tell me much about the control structure or the execution stack at the moment of the error. I've tried debug_backtrace(), but that just shows me the stack during shutdown, not the stack at the time of the error.

I know I can just raise the memory limit using ini_set or modifying php.ini, but that doesn't get me any closer to actually figuring out what is consuming so much memory or what my execution flow looks like during the error.

Anyone have a good methodology for debugging memory errors in advanced Object Oriented PHP programs?

like image 717
Kevin Owocki Avatar asked May 24 '11 17:05

Kevin Owocki


People also ask

How do I fix out of memory error in PHP?

Create a phpinfo. php file under root directory and check for current memory limits. By default memory limit is 8M, but in this case you have to increase the memory limits to 12M, 16M, 24M and so on with this line. This will increase your memory limit and solve this error.

How do I monitor PHP memory usage?

The memory_get_usage function can be used to track the memory usage. The 'malloc' function is not used for every block required, instead a big chunk of system memory is allocated and the environment variable is changed and managed internally. The above mentioned memory usage can be tracked using memory_get_usage().

How do I fix PHP fatal error allowed memory size 134217728 bytes exhausted?

The correct way is to edit your php. ini file. Edit memory_limit to your desire value. As from your question, 128M (which is the default limit) has been exceeded, so there is something seriously wrong with your code as it should not take that much.


2 Answers

echo '<pre>'; $vars = get_defined_vars(); foreach($vars as $name=>$var) {     echo '<strong>' . $name . '</strong>: ' . strlen(serialize($var)) . '<br />'; } exit();  /* ... Code that triggers memory error ... */ 

I use this to print out a list of currently assigned variables just before a problem section of my code, along with a (very) rough estimate of the size of the variable. I go back and unset anything that isn't needed at and beyond the point of interest.

It's useful when installing an extension isn't an option.

You could modify the above code to use memory_get_usage in a way that will give you a different estimate of the memory in a variable, not sure whether it'd be better or worse.

like image 81
Nick Pickering Avatar answered Sep 26 '22 03:09

Nick Pickering


Memprof is a php extension that helps finding those memory-eaters snippets, specially in object-oriented codes.

This adapted tutorial is quite useful.

Note: I unsuccessfully tried to compile this extension for windows. If you try so, be sure your php is not thread safe. To avoid some headaches I suggest you to use it under *nix environments.

Another interesting link was a slideshare describing how php handles memory. It gives you some clues about your script's memory usage.

like image 25
Héctor Paúl Cervera-García Avatar answered Sep 24 '22 03:09

Héctor Paúl Cervera-García