Hamilton Turner wrote:
Just a follow-up on this, the problem was 'Fatal error: Allowed memory size of 8388608 bytes exhausted'

After some nice help, I found that this is actually a common problem with intense regexes in php. Quick fix is using ini_set() to increase your memory_limit to something massive, like '400M'. This gives your script access to that much memory for its life-time. If you have this problem, then you probably also have to do this

set_time_limit(0);  //remove any max execution time

Hamilton

PS - for anyone confused, here was the script . . . i didnt think it was that confusing, sorry guys!

function parse_access($file_name)
{
   // read file data into variable
   $fh = fopen($file_name, 'r') or die("cant open file for reading");
   $theData = fread($fh, filesize($file_name));
   fclose($fh);

   // perform regex
$regex = '!(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}) - - \[(\d{2})/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Aug|Oct|Nov|Dec)/(\d{4}):(\d{2}):(\d{2}):(\d{2}) -\d+] {1,4}"GET ([._0-9\-%a-zA-Z/,?=]+) ([.0-9a-zA-Z%/\-,_?]+)" (\d{3}) (\d+) \[(.+?)] \[(.+?)] \[(.+?)] (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)!';
   //echo $regex . '<br><br><hr><br>';
   $num = preg_match_all($regex, $theData, $match, PREG_SET_ORDER);
   //echo "after regex - we are still alive!";

//go on to do some boring stuff, like write this to an array, perform stuff, graph stuff, blah blah
}

Increasing the memory limit is the worst possible solution to this "problem".

It's a giant file, and your regex is basically pulling out each line. For the love of $DEITY learn about fgets and process each line one by one rather than loading in the whole file. It'll be a lot faster and won't suck your memory dry while it runs.

-Stut

--
http://stut.net/

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to