当前位置:首页 > PHP教程 > php应用 > 列表

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-24 16:27:00 浏览: 评论:0 

这篇文章主要介绍了Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)错误的解决方法,需要的朋友可以参考下

今天要用php代码来处理一个580M的日志文件,总共有219万多行记录,因为是.log的文件,在windows下面很难将文件按照条数来分割,于是在linux下用split -l 10000 filename 前缀名 将整个文件按10000行一个分割成了200多个小文件,之后用php来循环处理这200多个文件,可是执行到后来就出现了题目上面的错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)

去百度了一下,原来是php.ini中的内存分配的问题,默认php代码能够申请到的最大内存字节数就是134217728 bytes,如果代码执行的时候再需要更多的内存,就会报错了,于是就将php.ini文件中的配置改了一下:

memory_limit = 128M;//将128M改成了256M

但是之后一想,一个php脚本一次请求的内存空间就要超过128M,那不管你以后将memory_limit设置成多大,以后肯定有出问题的时候。

究其原因,是我在在编码时,仅仅对变量赋值,却从来没有 unset ($var) 过。导致了内存占用越来越多,所以以后一个变量不再使用之后,一定要记得unset掉它。

下面附上我今天处理这个日志文件的代码:

  1. <?php 
  2. set_time_limit(1800) ; 
  3. /** 
  4.  * 获取日志中发送失败的邮箱地址 
  5.  * @param $directory log日志的目录 
  6.  * @param $name    失败邮箱保存的文件名 
  7.  */ 
  8. function getmail($directory,$name){ 
  9. //遍历目录下的.log文件 
  10.     $files=scandir("$directory"); 
  11.     foreach($files as $v){ 
  12.         if(preg_match_all("|mail\.log\D+|",$v,$log)){ 
  13.             $logs[]=$log[0][0]; 
  14.         } 
  15.     } 
  16. //将所有.log文件中发送失败邮箱提取出来    
  17.     foreach($logs as $v){ 
  18.         $row=file("$v"); 
  19.         echo "读取".$v."文件<br />"
  20.         foreach($row as $key => $value
  21.         { 
  22.             if(eregi("host name lookup failure|Connection timed out with|Connection refused by|cannot find your reverse hostname"$value)){ 
  23.                 if(preg_match("|\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*|"$row[$key],$matches)){ 
  24.                     $mail[] = trim($matches[0]); 
  25.                     echo "获取发送失败的邮箱地址".$matches[0]."<br />"
  26.                 }else
  27.                     echo "无法获取日志中发送失败的邮箱,请检查"
  28.                 } 
  29.             } 
  30.         } 
  31.         unset($row); 
  32.     } 
  33. //将提取出来的发送失败邮箱写入到mail.txt文件中    
  34.     $mailurl=fopen("$name","a"); 
  35.     foreach($mail as $line
  36.     { 
  37.         fwrite($mailurl,$line."\r\n"); 
  38.     }//www.phpfensi.com 
  39.     echo "将所有发送失败的邮箱地址写入".$name."<br />"
  40.     fclose($mailurl); 
  41. getmail(".","mail.txt"); 
  42. ?> 

Tags: Fatal error: Allowed memory

分享到: