如何获知PHP程序占用多少内存(memory_get_usage)

下面是使用示例:


代码如下:

<?php
echo memory_get_usage(), '<br />'; // 313864
$tmp = str_repeat('http://www.nowamagic.net/', 4000);
echo memory_get_usage(), '<br />'; // 406048
unset($tmp);
echo memory_get_usage(); // 313952
?>

上面的程序后面的注释代表了它们的输出(单位为 byte(s)),也就是当时 PHP 脚本使用的内存(不含 memory_get_usage() 函数本身占用的内存)。

由上面的例子可以看出,要想减少内存的占用,可以使用 PHP unset() 函数把不再需要使用的变量删除。类似的还有:PHP mysql_free_result() 函数,可以清空不再需要的查询数据库得到的结果集,这样也能得到更多可用内存。

PHP memory_get_usage() 函数还可以有个参数,$real_usage,其值为布尔值。默认为 FALSE,表示得到的内存使用量不包括该函数(PHP 内存管理器)占用的内存;当设置为 TRUE 时,得到的内存为不包括该函数(PHP 内存管理器)占用的内存。

所以在实际编程中,可以用 memory_get_usage() 函数比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。

贴个使用函数:


代码如下:

if (!function_exists('memory_get_usage'))
{
/**
+----------------------------------------------------------
* 取得内存使用情况
+----------------------------------------------------------
* @return integer
+----------------------------------------------------------
*/
function memory_get_usage()
{
$pid = getmypid();
if (IS_WIN)
{
exec('tasklist /FI "PID eq ' . $pid . '" /FO LIST', $output);
return preg_replace('/[^0-9]/', '', $output[5]) * 1024;
}
else
{
exec("ps -eo%mem,rss,pid | grep $pid", $output);
$output = explode(" ", $output[0]);
return $output[1] * 1024;
}
}
}

再来个函数使用例子:


代码如下:

<?php
//memory_get_usage();
$m1 = memory_get_usage();
echo '<br /> m1:',$m1;//58096
$a = 'hello';
$b = str_repeat($a,1000);
$m2 = memory_get_usage();
echo '<br /> m2:',$m2;//63424
unset($b);
$m3 = memory_get_usage();
echo '<br /> m3:',$m3;//58456
?>

(0)

相关推荐

  • PHP读取txt文本文件并分页显示的方法

    本文实例讲述了PHP读取txt文本文件并分页显示的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php     session_start();     if (empty($page)) {$page=1;}     if (isset($_GET['page'])==TRUE) {$page=$_GET['page']; } ?> <html> <head> <meta http-equiv="Content-Type&q

  • PHP从FLV文件获取视频预览图的方法

    本文实例讲述了PHP从FLV文件获取视频预览图的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php // references http://www.longtailvideo.com/support/forum/Modules/12661/External-PHP-with-FFmpeg-using-readfile- // generate a preview image from an FLV file on-the-fly, or to save // ca

  • PHP实现从远程下载文件的方法

    本文实例讲述了PHP实现从远程下载文件的方法.分享给大家供大家参考.具体实现方法如下: <?php if ($_GET[xfer]) { if ($_POST[from] == "") { print "You forgot to enter a url."; } else { copy("$_POST[from]", "$_POST[to]"); $size = round((filesize($_POST[to])/

  • php计算指定目录下文件占用空间的方法

    本文实例讲述了php计算指定目录下文件占用空间的方法.分享给大家供大家参考.具体分析如下: php中可以通过 RecursiveDirectoryIterator 扩展 DirectoryIterator的getChildren() 方法提供访问子目录中的每一个元素的方法,下面的代码通过遍历访问目录下的所有文件,获取他们暂用的空间. <?php $dir = new RecursiveDirectoryIterator('C:\wamp'); $totalSize = 0; foreach (n

  • php限制上传文件类型并保存上传文件的方法

    本文实例讲述了php限制上传文件类型并保存上传文件的方法.分享给大家供大家参考.具体如下: 下面的代码演示了php中如何获取用户上传的文件,并限制文件类型的一般图片文件,最后保存到服务器 <?php $allowedExts = array("gif", "jpeg", "jpg", "png"); $extension = end(explode(".", $_FILES["file&qu

  • PHP查询MySQL大量数据的时候内存占用分析

    昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用. 所以, 他问, 在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了? - 复制代码 代码如下: while ($row = mysql_fetch_assoc($result)) { // ... } 当然, 这种问题有许多优化的方法. 不过, 就这个问题来讲, 我首先想到, MySQL是经典的C/S(Client/Server, 客户端/服务器)

  • phpQuery占用内存过多的处理方法

    phpQuery是一个用php实现的类似jQuery的开源项目,可以在服务器端以jQuery的语法形式解析网页元素. 相对于正则或其它方式匹配网页方式,phpQuery使用起来要方便的多.在使用phpQuery采集网页时,遇到一个问题:在处理大量网页之后,phpQuery占用的内存数量非常惊人(很快就超过了1G),比如这段代码: 复制代码 代码如下: while (true) {    phpQuery::newDocumentFile($htmlFile);    // 处理网页元素...  

  • PHP判断网络文件是否存在的方法

    本文实例讲述了PHP判断网络文件是否存在的方法.分享给大家供大家参考.具体实现方法如下: $file = "http://www.jb51.net/demo/file_exists.zip"; $fileExists = @file_get_contents($file,null,null,-1,1) ? true : false; if($fileExists){ echo "File Exists!"; }else{ echo "Sorry, we c

  • PHP获取文件夹内文件数的方法

    本文实例讲述了PHP获取文件夹内文件数的方法.分享给大家供大家参考.具体实现方法如下: function getfilecounts($ff){ $dir = './'.$ff; $handle = opendir($dir); $i = 0; while(false !== $file=(readdir($handle))){ if($file !== '.' && $file != '..') { $i++; } } closedir($handle); return $i; } 希望

  • 如何获知PHP程序占用多少内存(memory_get_usage)

    下面是使用示例: 复制代码 代码如下: <?php echo memory_get_usage(), '<br />'; // 313864 $tmp = str_repeat('http://www.nowamagic.net/', 4000); echo memory_get_usage(), '<br />'; // 406048 unset($tmp); echo memory_get_usage(); // 313952 ?> 上面的程序后面的注释代表了它们的

  • C# WinForm应用程序降低系统内存占用方法总结

    背景: 微软的 .NET FRAMEWORK 现在可谓如火如荼了.但是,.NET 一直所为人诟病的就是"胃口太大",狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的. 以XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小

  • 解析Java程序中对象内存的分配和控制的基本方法

    一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

  • Python占用的内存优化教程

    概述 如果程序处理的数据比较多.比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题.下面我就给出几个优化Python占用内存的几个方法. 说明:以下代码运行在Python3. 举个栗子 我们举个简单的场景,使用Python存储一个三维坐标数据,x,y,z. Dict 使用Python内置的数据结构Dict来实现上述例子的需求很简单. >>> ob = {'x':1, 'y':2,

  • C++程序的五大内存分区实力详解

    目录 1.栈内存区 1.1.调用函数时通过栈来传递函数的参数值 1.2.线程占用的栈内存是有上限的 2.堆内存区 3.全局/静态内存区 4.文字常量区 5.程序代码区 总结 C++程序在运行时所占用的内存区域,一般可分为栈内存区.堆内存区.全局/静态内存区.文字常量内存区及程序代码区5大分区: 下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区. 1.栈内存区 栈内存区是我们用的最多的分区,只要有函数的地方都会使用到这个分区.栈分区是用来存放函数参数及函数

  • C++程序的五大内存分区实例详解

    目录 1.栈内存区 1.1.调用函数时通过栈来传递函数的参数值 1.2.线程占用的栈内存是有上限的 2.堆内存区 3.全局/静态内存区 4.文字常量区 5.程序代码区 C++程序在运行时所占用的内存区域,一般可分为栈内存区.堆内存区.全局/静态内存区.文字常量内存区及程序代码区5大分区: 下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区. 1.栈内存区 栈内存区是我们用的最多的分区,只要有函数的地方都会使用到这个分区.栈分区是用来存放函数参数及函数局部变

  • rsync备份海量文件时占用大量内存的解决方法

    linux发行版中大多都自带rsync,不过版本比较低,一般都是2.6.X 在2.X的版本中,rsync备份时都是先列表再备份(添加或者删除),在处理大量文件时,会耗费比较多的内存. 备份的时候,rsync扫描到的每个文件(目录也一样),在它的列表中约占100字节的内存,如果加了--delete参数的话,占用的内存会更多. 例如我这里一台服务器,约800万的图片,而且更新比较频繁,文件数增长比较快,差不多每天增加约10万张.备份的时候,rsync大约占用了将近2G的内存,大量内存的占用,造成服务

  • python清除函数占用的内存方法

    python升级到2.7.13 函数执行的结尾加上这个即可 for x in locals().keys(): del locals()[x] gc.collect() 原理是,locals()会列出当前所有局部变量,手动的把当前函数生成的开销都给清空掉即可释放掉内存. 以上这篇python清除函数占用的内存方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • java程序运行时内存分配详解

    一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈.进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享.Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量.虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说

  • c#程序定期把内存信息记录到log日志示例

    设立一个定时器tmrMonitor,该定时器会在程序运行时不断把程序的占用内存和占用线程数写到LOG\MEM目录下.我设置的定时器间隔是3000毫秒,记录后的信息可以用来分析一段时间内程序的运行状况,比如内存泄漏问题. 复制代码 代码如下: /// <summary>/// Timer组件tmrMonitor的Tick事件/// </summary>/// <param name="sender"></param>/// <para

随机推荐