小编

Fatal Error:Allowed memory size of xxxxxx bytes exhausted

做事器很多自动任务的php脚本占用做事内存过多,并且程序不在运行了。

办理方法:

php内存占用PHP剧本占用内存太多解决计划 AJAX

在运行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可用可不用