PHP脚本占用内存太多如何增加PHP的内存限制
Admin 2022-10-13 群英技术资讯 529 次浏览
解决方法:
在运行PHP程序,通常会遇到“Fatal Error:Allowed memory size of xxxxxx bytes exhausted”的错误, 这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过以下方法来增加PHP的内存限制(memory_limit)。
如何设置memory_limit
方法1:php. ini
最简单或常用的方法是修改php.ini
1.首先找到对你的网站生效的php. ini文件 由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。
对于Linux用户,你可以通过执行“php -i | grep Loaded Configuration File”来找到对应的配置文件。
而Windows用户,你可以尝试修改你的php安装目录下的php.ini。
2.编辑php.ini 在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例:
memory_limit = 128M ; 可以将128M改为任何你想设置的值,保存文件。
3.重启web 服务器 。
PHP开发过程中,高手都会用unset来释放内存,开始也没有深入了解,就跟着用,当然不是所有变量都unset,因为开发这么久了,也没感觉不unset有问题,但是最近的一个程序频繁出问题,总是内存不够用,为什么我知道内存不够用呢,因为使用ini_set(‘memory_limit’, ’2000M’);增加内存以后,程序就正常了,所以很明显,内存不够用,但是PHP不是会释放内存的吗,为是么会导致内存不够呢,没错,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可用可不用
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与PHP引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其...
这篇文章主要介绍了详解php伪造Referer请求反盗链资源,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文给大家详细总结介绍http状态码分类及其所代表的含义,大家可以收藏起来了解学习哦~
基于swoole的服务端应该在命令行方式下运行,以保证只有一个实例(端口是不能重复打开的)。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步IO。
如果某个类要实现这个接口,可以使用implements关键字,语法格式如下:interface接口名称//接口名一般要大写,要养成良好的编程习惯{成员函数列表}class类名implements接口名称//一个类可以实现多个接口。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008