Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 804|回复: 0

PHP脚本占用内存太多,解决方案

[复制链接]
  • TA的每日心情
    奋斗
    6 秒前
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-25 14:01:03 | 显示全部楼层 |阅读模式

    Fatal Error: Allowed memory size of xxxxxx bytes exhausted

    今天遇到服务器很多自动任务的php脚本占用服务内存过多,并且程序不在运行了。

    解决方法:

    在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytes exhausted”的错误, 这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。

    检查php的内存限制值

    为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。

    <?php phpinfo(); ?>

    将这个脚本放到你的Web服务器上,然后在浏览器中调用它。这时你可以看到你的PHP环境配置的信息,其中有一部分是关于“memory_limit”的, 如下图:

    注:你可以用这种方法来查看php的其他参数设置,不仅仅是memory_limit

    memory_limit应该设为多少?

    这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal 6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。

    如何设置memory_limit

    方法1: php.ini

    最简单或常用的方法是修改php.ini

    1.首先找到对你的网站生效的php.ini文件 由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。如果你上面的方法建立了php文件来查看其配置参数,则你可以找到“Loaded Configuration File”这一项,以下是个例子:

    对于Linux用户,你可以通过执行“php -i | grep Loaded Configuration File”来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。

    2.编辑php.ini 在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例

    memory_limit = 128M ; 可以将128M改为任何你想设置的值

    保存文件

    3.重启web 服务器 如果是web服务器使用Apache, 则执行:

    httpd restart

    有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。



    那么我们要怎么从程序的根本上来解决这个问题呢,请往下看:


    PHP开发过程中,高手都会用unset来释放内存,开始也没有深入了解,就跟着用,当然不是所有变量都unset,因为开发这么久了,也没感觉不unset有问题,但是最近的一个程序频繁出问题,总是内存不够用,为是么我知道内存不够用呢,因为使用ini_set(‘memory_limit’, ’2000M’);增加内存以后,程序就正常了,所以很明显,内存不够用,但是PHP不是会释放内存的吗,为是么会导致内存不够呢,没错,PHP是会释放内存,但是是每个函数执行完释放一次,整个程序跑完才能完全释放,而为了采集,每个程序都由许多函数来跑,这些函数有的使用内存过多,还没能等到执行完毕释放内存,就死掉了,整个程序也就中断了,下面看几个例子,会有更深的体会。

        function test()
        {
        echo memory_get_usage().”    test函数开始使用内存\n”;

        $a[]=’a';
        unset($a);
        echo memory_get_usage().”    给数组a赋值后使用内存\n”;

        $b[]=’b';
        unset($b);
        echo memory_get_usage().”    给数组b赋值后使用内存\n”;

        $c[]=’c';
        unset($c);
        echo memory_get_usage().”    给数组c赋值后使用内存\n”;
        }

        echo memory_get_usage() . ”    PHP读入当前文件所用内存,代码越多,内存占用越多\n”;
        test();
        echo memory_get_usage() . ”    运行完test函数所用内存\n”;
        test();
        echo memory_get_usage() . ”    再运行一次test函数所用内存\n”;
        ?>

    结果:

    321124    PHP读入当前文件所用内存,代码越多,内存占用越多

    321144    test函数开始使用内存

    321144    给数组a赋值后使用内存

    321144    给数组b赋值后使用内存

    321144    给数组c赋值后使用内存

    321144    运行完test函数所用内存

    321144    test函数开始使用内存

    321144    给数组a赋值后使用内存

    321144    给数组b赋值后使用内存

    321144    给数组c赋值后使用内存

    321144    再运行一次test函数所用内存

        function test()
        {
        echo memory_get_usage().”    test函数开始使用内存\n”;

        $a[]=’a';
        //unset($a);
        echo memory_get_usage().”    给数组a赋值后使用内存\n”;

        $b[]=’b';
        //unset($b);
        echo memory_get_usage().”    给数组b赋值后使用内存\n”;

        $c[]=’c';
        //unset($c);
        echo memory_get_usage().”    给数组c赋值后使用内存\n”;
        }

        echo memory_get_usage() . ”    PHP读入当前文件所用内存,代码越多,内存占用越多\n”;
        test();
        echo memory_get_usage() . ”    运行完test函数所用内存\n”;
        test();
        echo memory_get_usage() . ”    再运行一次test函数所用内存\n”;
        ?>

    结果:

    320896    PHP读入当前文件所用内存,代码越多,内存占用越多

    320916    test函数开始使用内存

    321120    给数组a赋值后使用内存

    321324    给数组b赋值后使用内存

    321528    给数组c赋值后使用内存

    320916    运行完test函数所用内存

    320916    test函数开始使用内存

    321120    给数组a赋值后使用内存

    321324    给数组b赋值后使用内存

    321528    给数组c赋值后使用内存

    320916    再运行一次test函数所用内存

    从以上结果得知:

    1.函数内不unset变量的话内存会越用越多,但是这个占用是一时的,这个函数一执行完这些内存就会释放,所以不会导致整个程序占用内存过多,这就需要保证一个函数不能使用内存过多,否则超过额定内存(PHP的额定内存一般设置为38M,可以通过ini_set(‘memory_limit’, ’2000M’)设置),程序就会退出。

    2.函数内unset了变量,对于整个程序来说占用的内存更多,不unset反而用得少,这是是么原因呢,我个人觉得,从宏观角度来说,我们不去观察函数,而是把函数看成是一个操作,那这个操作内容越多,占用的内存就越多,所以执行unset这个操作后,使用的内存反而更多,当然,这个内存的增加是可以忽略不计的,而函数内部的变量如果很大的话,不unset的话,可能执行这个函数的时候就卡死在那里了,所以unset还是必须的

    3.最后查了很多资料,了解到,在PHP4年代,PHP执行是内存不够用再向系统要,用完了再给回系统,所以内存占用从任务管理器里面可以很清楚的看到,但是PHP5之后,PHP执行的时候会先向系统征用一块大内存,然后自己管理,超过这个内存程序再向系统要,所以在任务管理器是看不出程序执行时内存使用情况的,这也导致很多人觉得unset可用可不用
    ---------------------
    作者:Sunface撩技术
    来源:CSDN
    原文:https://blog.csdn.net/erlib/article/details/38488825
    版权声明:本文为博主原创文章,转载请附上博文链接!

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-24 15:47 , Processed in 0.063423 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表