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

 更新时间:2014年11月08日 12:13:43   投稿:junjie  
这篇文章主要介绍了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掉它。

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

复制代码 代码如下:

<?php
set_time_limit(1800) ;
/**
 * 获取日志中发送失败的邮箱地址
 * @param $directory log日志的目录
 * @param $name    失败邮箱保存的文件名
 */
function getmail($directory,$name){
//遍历目录下的.log文件
    $files=scandir("$directory");
    foreach($files as $v){
        if(preg_match_all("|mail\.log\D+|",$v,$log)){
            $logs[]=$log[0][0];
        }
    }
//将所有.log文件中发送失败邮箱提取出来   
    foreach($logs as $v){
        $row=file("$v");
        echo "读取".$v."文件<br />";
        foreach($row as $key => $value)
        {
            if(eregi("host name lookup failure|Connection timed out with|Connection refused by|cannot find your reverse hostname", $value)){
                if(preg_match("|\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*|", $row[$key],$matches)){
                    $mail[] = trim($matches[0]);
                    echo "获取发送失败的邮箱地址".$matches[0]."<br />";
                }else{
                    echo "无法获取日志中发送失败的邮箱,请检查";
                }
            }
        }
        unset($row);
    }
//将提取出来的发送失败邮箱写入到mail.txt文件中   
    $mailurl=fopen("$name","a");
    foreach($mail as $line)
    {
        fwrite($mailurl,$line."\r\n");
    }
    echo "将所有发送失败的邮箱地址写入".$name."<br />";
    fclose($mailurl);
}

getmail(".","mail.txt");
?>

相关文章

  • 如何写php守护进程(Daemon)

    如何写php守护进程(Daemon)

    这篇文章主要介绍了如何写php守护进程Daemon,
    2015-12-12
  • yii 2.0中表单小部件的使用方法示例

    yii 2.0中表单小部件的使用方法示例

    这篇文章主要给大家介绍了关于yii 2.0中表单小部件的使用方法,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • PHP5.3.1 不再支持ISAPI

    PHP5.3.1 不再支持ISAPI

    今天发现PHP5.3.1发布了,但是安装的时候没有找到ISAPI模式,安装后也没有找到php5isapi.dll这个文件,找了好久,终于弄清楚。
    2010-01-01
  • php中执行系统命令的方法

    php中执行系统命令的方法

    这篇文章主要介绍了php中执行系统命令的方法,涉及escapeshellcmd及exec方法的使用技巧,需要的朋友可以参考下
    2015-03-03
  • PHP中定义数组常量(array常量)的方法

    PHP中定义数组常量(array常量)的方法

    这篇文章主要介绍了PHP中定义数组常量(array常量)的方法,本文在类中使用了const关键字和eval()函数来实现,需要的朋友可以参考下
    2014-11-11
  • PHP源代码数组统计count分析

    PHP源代码数组统计count分析

    偶然在百度知道中看到有个同学问起count及strlen的效率问题,好吧这个问题我当初没理解透彻,认为其不属两个不一样的东西不可比较,后来看了楼主的回复才反应过来,所以自己也去找了下源码查看下。现在总结下查看到的结果并记录之。
    2011-08-08
  • php微信开发自定义菜单

    php微信开发自定义菜单

    这篇文章主要为大家详细介绍了php微信开发自定义菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 简单谈谈PHP中的Reload操作

    简单谈谈PHP中的Reload操作

    通常修改了 PHP 的配置后,为了让修改生效会执行 reload,而不是 restart,但最近在使用Reload操作的时候发现了502错误,想着还是要重新思考这个问题。所以这篇文章主要给大家介绍了关于PHP中Reload操作的内容,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • PHP实现文件下载断点续传详解

    PHP实现文件下载断点续传详解

    这篇文章主要介绍了PHP实现文件下载断点续传详解,本文讲解了载断点续传的实现理解,并给出了实现代码,需要的朋友可以参考下
    2014-10-10
  • JSON字符串传到后台PHP处理问题的解决方法

    JSON字符串传到后台PHP处理问题的解决方法

    这篇文章主要介绍了JSON字符串传到后台PHP处理问题的解决方法,需要的朋友可以参考下
    2016-06-06

最新评论