一.问题描述:

最近网站运行时,服务器老是出现问题提示:phpstudy apache http server已停止工作

二.原因分析:

查看了一下安装目录下的logs\error.log发现问题原因是: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes) in..........\\ThinkPHP\\Library\\Think\\Db\\Driver\\Mysql.class.php on line 198,原来是php.ini中的内存分配不足的问题。

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

三.解决办法如以下记录:


一).根据自己的需要及参考本机的内存大小修改或取消php内存限制,如改为1024M)

  1、修改php.ini(修改后请重新启动Apache),一个php脚本写得不好,不管你以后将memory_limit设置成多大,肯定有出问题的时候:

       1).修改php.ini内存限制,在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例:

memory_limit = 128M;//128M改为1024M

  2、在php程序里面修改或取消php内存限制

       1).修改PHP的内存限制 1).修改PHP的内存限制在php程序中添加:

ini_set(”memory_limit”, ”1024M”);

       2).取消PHP的内存限制在php程序中添加:

ini_set("memory_limit","-1");

     3、这种方法只有在php以Apache模块来执行时才生效。 在你的网站的根目录下找到“.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中php_value memory_limit 128M ; 可以将128M改为任何你想设置的值


二).究其原因,是在编码时,仅仅对变量赋值,却从来没有 unset ($var) 过。导致了内存占用越来越多,所以以后一个变量不再使用之后,一定要记得unset掉它,最大限度节省内存资源。

应用层代码测试内存:

<?
printf(" run total time: %.2f s<br>".
"memory usage num: %.2f M<br> ",
microtime(true)-$HeaderTime,
memory_get_usage() / 1024 / 1024 );
?>


运行结果显示如下:

run total time: 1.57 s

memory usage num: 97.09 M

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

Logo

更多推荐