1. 云栖社区>
  2. PHP教程>
  3. 正文

php内存限制

作者:用户 来源:互联网 时间:2017-12-01 16:25:09

php内存限制

php内存限制 - 摘要: 本文讲的是php内存限制, 最近的页面好像越写越大,一个index.页面居然都会产生这种错误: [Mon Nov 10 10:49:09 2008] [error] [client 127.0.0.1] PHP Fatalerror:Allowed memory s



最近的页面好像越写越大,一个index.页面居然都会产生这种错误:


[Mon Nov 10 10:49:09 2008] [error] [client 127.0.0.1] PHP Fatalerror:Allowed memory size of 16777216 bytes exhausted (tried toallocate 40 bytes) in /xxx/..//patterntext.class.php on line 16
[Mon Nov 10 10:57:53 2008] [error] [client 127.0.0.1] PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 40bytes) in /xxx/..//patterntext.class.php on line 16
[Mon Nov 10 11:05:10 2008] [error] [client 127.0.0.1] PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 40bytes) in /xxx/..//patterntext.class.php on line 16
[Mon Nov 10 11:05:56 2008] [error] [client 127.0.0.1] PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 40bytes) in /xxx/..//patterntext.class.php on line 16
一个页面脚本都能超出 16M 的范围。


php中的相关文档解释 memory_limit 如下:


memory_limit integer
该指令设定了一个脚本 所能够申请到的最大内存字节数。这有助于防止写得不好的脚本消耗光服务器上的可用内存。要使用此指令必须在编译的时候激活。因此configure 一行中应该包括:--enable-memory-limit。如果不需要任何内存上的限制,必须将其设为 -1。 从 php4.3.2 起,当激活了 memory_limit,PHP 函数 memory_get_usage() 便可以使用了。
也就是说,php在一个 page 中的处理内存限制,默认的(/etc/php.ini)定义为 16M (我的系统默认安装后),后来开发组的应用写的越来越复杂,但是在结构上可能还有些欠缺,频繁的对象请求,居然造成了内存不足。倒是可以使用下面的内容来解决:


1. 在php中调用 init_set('memory_limix', 'xxxM'),这样可以指定某个站点中 单页面可以使用的内存数


2. 修改 /etc/php.ini 中 memory_limit 16M 的设定 (需要 service httpd restart 才生效)


至于调整到多少,可以根据测试,一点一点加上来


上面我们说过,最好的方式应该在应用层面解决,而不是不停的增加内存设置。我对代码进行了一个测试,在页面结尾输出下面内容:


<?
printf("total run: %.2f s<br>".
"memory usage: %.2f M<br> ",
microtime(true)-$HeaderTime,
memory_get_usage() / 1024 / 1024 );
?>
结果显示可以用骇人听闻来形容:


total runtime: 1.47 s


memory usage: 77.09 M



一个页面居然会有77M的请求。究其原因,是程序员在编码时,仅仅对变量赋值,却从来没有 unset ($var)过。试想,如果一个页面请求要处理20个sql查询,每个sql查询返回10个sql结果,而程序员从来都不关心是返回一个row的所有column还是 仅仅返回需要的column(实际上当我们采用更common的中间层时,往往会返回全部的column而不是特定的某几个字段,就像在 ORM中如NHibernate, JBOSS中的那样)如果一条row有10K, 那么这个页面到处理结束时就要增加到10K*10*20=2M的数组分配,这还不算有时候我们需要最数组进行复制。


因此在php中,比较合理的方式,还是用后就 unset($var) 吧。毕竟资源还是有限制的。



以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 内存 限制 ,以便于您获取更多的相关知识。

稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一

6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验

弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

开发者常用软件,超百款实用软件一站式提供