如何获知PHP程序占用内存多少内存memory

2173人阅读

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可用可不用
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:941218次
积分:15636
积分:15636
排名:第528名
原创:588篇
转载:90篇
译文:56篇
评论:150条
阅读:13376
阅读:13678
文章:29篇
阅读:79036
文章:26篇
阅读:39235现在的位置:
-& php获取页面运行使用内存的两个函数php获取页面运行使用内存的两个函数原来php也是可以获取内存的,比如我们这个页面运行下来花了多少内存,都是可以用memory_get_usage()函数来读取出来的。那么,以后我们可以用这个函数方便的判断咱们写的程序优化度高不高,因为足够的优化对于大型项目很有作用,相信下面两个函数,对于php学习来说,还是很不错的。&?php//返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)echo &Initial: &.memory_get_usage().& bytes &br/&&; &//返回分配给你的 PHP 脚本的内存峰值字节数。echo &Peak: &.memory_get_peak_usage().& bytes &br/&&; &?&开始看到这个函数还以为php可以获取电脑的的内存呢,自己运行了一下才发现是获取当前php脚本运行时候的内存,貌似还没找到可以获取Window端内存使用情况的函数,linux好像可以通过popen()函数通过执行访问相关的linux的命令,并捕获其中的数据提取出CPU和内存的相关信息。不过,我没有安装linux,于是也没有去测试。&文章出自: 本站所有文章,除注明出处外皆为原创,转载请注明本文地址,版权所有。分享到:您可能还会对这些文章感兴趣!&最新文章最受欢迎热门排行最新评论& & 一,函数原型& & int memory_get_usage ([ bool $real_usage = false ] )& & 二,版本兼容& & PHP 4 >= 4.3.2, PHP 5& & 三,基础用法与实例& & 1,获取当前的内存消耗量& & 复制代码代码如下:& & <?php& & echo memory_get_usage();& & $var = str_repeat("liuhui", 10000);& & echo memory_get_usage();& & unset($var);& & echo memory_get_usage();& & ?>& & 分别输出: 62416& & 说明:memory_get_usage()函数输出的数值为bytes单位& & 2,格式化memory_get_usage()输出& & 复制代码代码如下:& & <?php& & function convert($size){& & $unit=array('b','kb','mb','gb','tb','pb');& & return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];& & }& & echo convert(memory_get_usage(true));& & ?>& & 输出:256 kb& & 3,自定义函数获取数组或变量值大小& & 复制代码代码如下:& & <?php& & function array_size($arr) {& & ob_start();& & print_r($arr);& & $mem = ob_get_contents();& & ob_end_clean();& & $mem = preg_replace("/\n +/", "", $mem);& & $mem = strlen($mem);& & return $& & }& & $memEstimate = array_size($GLOBALS);& & ?>& & 参考资料:http://cn.php.net/manual/en/function.memory-get-usage.php& & 您可能感兴趣的文章:php共享内存段示例分享PHP变量内存分配问题记录整理phpQuery占用内存过多的处理方法关于php内存不够用的快速解决方法解析PHP中的unset究竟会不会释放内存浅析php中如何在有限的内存中读取大文件解析PHP中的内存管理,PHP动态分配和释放内存关于PHP内存溢出问题的解决方法深入解析PHP内存管理之谁动了我的内存深入解析PHP垃圾回收机制对内存泄露的处理深入PHP内存相关的功能特性详解php页面消耗内存过大的处理办法phpExcel导出大量数据出现内存溢出错误的解决方法如何获知PHP程序占用多少内存(memory_get_usage)PHP管理内存函数 memory_get_usage()使用介绍PHP中使用unset销毁变量并内存释放问题PHP中文件缓存转内存缓存的方法php统计时间和内存使用情况示例分享& & QQ空间
百度搜藏更多& & Tags:memory get usage 内存清耗量& & 复制链接收藏本文打印本文关闭本文返回首页& & 上一篇:PHP中文件缓存转内存缓存的方法& & 下一篇:php 无限级分类,超级简单的无限级分类,支持输出树状图& & 相关文章PHP模块 Memcached功能多于Memcache不重新编译PHP为php增加openssl模块的方法PHP Squid中可缓存的动态网页设计深入理解PHP中的Session和Cookie用php随机生成福彩双色球号码的2种方法从一个不错的留言本弄的mysql数据库操作类用php实现让页面只能被百度gogole蜘蛛访问的方法php IP及IP段进行访问限制的代码从PHP $_SERVER相关参数判断是否支持Rewrite模块PHP中的函数嵌套层数限制分析& & 文章评论& & 最 近 更 新& & PHP脚本中include文件出错解决方法PHP header函数分析详解解决dede生成静态页和动态页转换的一些问php中自定义函数dump查看数组信息类似var解析php扩展php_curl.dll不加载的解决方法PHP ajax 分页类代码Ajax+PHP边学边练 之五 图片处理JSON在PHP中的应用介绍mysql 的 like 问题,超强毕杀记!!!扩展你的 PHP 之入门篇& & 热 点 排 行& & php中iconv函数使用方法PHP 页面跳转到另一个页面的多种php字符串截取问题PHPMyadmin 配置文件详解(配置)火车头采集器3.0采集图文教程php出现Cannot modify header in特详细的PHPMYADMIN简明安装教程php中json_decode()和json_encodphp下intval()和(int)转换使用与require(),include(),require_on
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程PHP内存使用情况如何获取
投稿:lijiao
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了PHP内存使用情况如何获取,感兴趣的小伙伴们可以参考一下
PHP内置函数memory_get_usage()能返回当前分配给PHP脚本的内存量,单位是字节(byte)。在WEB实际开发中,这些函数非常有用,我们可以使用它来调试PHP代码性能。
memory_get_usage()函数返回内存使用量,memory_get_peak_usage()函数返回内存使用峰值,getrusage()返回CUP使用情况。但有一点请注意,在这些函数需要在Linux上运行。
下面我们来看一个实例:
echo '开始内存:'.memory_get_usage(), '';
$tmp = str_repeat('hello', 1000);
echo '运行后内存:'.memory_get_usage(), '';
unset($tmp);
echo '回到正常内存:'.memory_get_usage();
输出结果:
开始内存:147296
运行后内存:152456
回到正常内存:147296
例子中,我们使用str_repeat()将字符串“hello”重复了1000遍,最终来对比前后消耗的内存大小。由上面的例子可以看出,要想减少内存的占用,可以使用unset() 函数把不再需要使用的变量删除。类似还有mysql_free_result() 函数,当我们不再需要查询数据得到的结果集时,可以使用释放查询占用的内存。
函数memory_get_usage()还可以有个参数,$real_usage,其值为布尔值。如果设置为 TRUE,获取系统分配的真实内存尺寸。如果未设置或者设置为 FALSE,将是 emalloc() 报告使用的内存量。
在实际WEB开发中,可以用PHP memory_get_usage()比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。
函数memory_get_usage()返回的字节数(单位为 byte(s))。
下面这个自定义函数将字节数转换成MB更容易阅读:
function memory_usage() {
= ( ! function_exists('memory_get_usage')) &#63; '0' : round(memory_get_usage()/, 2).'MB';
常用的调试检测PHP代码性能的方法有:
memory_get_usage可以分析内存占用空间。
用microtime函数就可以分析程序执行时间。
通过这篇文章大家知道php是如何获取内存使用情况了吧,希望这篇文章能够对大家的学习有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 win7没开程序占用内存 的文章

 

随机推荐