php v5.2中的内存管理器

PHP 中的内存管理函数

除了使内存管理器更灵活更透明之外,PHP V5.2 还为 memory_get_usage() memory_get_peak_usage() 提供了一个新参数,这两个函数允许查看内存使用量。说明中提及的新布尔值是 real_size。通过调用函数 memory_get_usage($real);(其中 $real = true),结果将为调用时系统中实际分配的内存大小,包括内存管理器开销。如果不使用标记组,则返回的数据将只包括在运行脚本内使用的内存,减去内存管理器开销。

memory_get_usage() memory_get_peak_usage() 的不同之处在于后者将返回到目前为止调用它的运行进程的最高内存量,而前者只返回执行时的使用量。

对于 memory_get_usage()php.net 提供了清单 1 中的代码片段。


清单 1. memory_get_usage() 示例

                

<?php

 

// This is only an example, the numbers below will

// differ depending on your system

 

echo memory_get_usage() . "\n"; // 36640

$a = str_repeat("Hello", 4242);

echo memory_get_usage() . "\n"; // 57960

unset($a);

echo memory_get_usage() . "\n"; // 36744

 

?>

 

在这个简单示例中,我们首先回转了直接调用 memory_get_usage() 的结果,代码注释中显示可能在作者的系统中有 36640 字节的常见结果。然后我们使用 4,242 “Hello” 副本来装载 $a 并再次运行函数。


1. memory_get_usage() 的示例输出

没有 memory_get_peak_usage() 的示例,因为两者十分相似,语法是相同的。但是,对于清单 1 中的示例代码,将只有一个结果,即当时的最高内存使用量。让我们看一看清单 2


清单 2. memory_get_peak_usage() 示例

                

<?php

 

// This is only an example, the numbers below will

// differ depending on your system

 

echo memory_get_peak_usage() . "\n"; // 36640

$a = str_repeat("Hello", 4242);

echo memory_get_peak_usage() . "\n"; // 57960

unset($a);

echo memory_get_peak_usage() . "\n"; // 36744

 

?>

 

清单 2 中的代码跟图 1 一样,但是 memory_get_usage() 已经替换为 memory_get_peak_usage()。在我们用 4242 “Hello” 副本填充 $a 之前,输出都不会有多大更改。内存跳升至 57960,表示到目前为止的峰值。当检查内存使用量峰值时,得到了目前为止的最高值,因此所有进一步调用都将得到 57960,直至我们处理的操作比处理 $a 使用的内存更多


2. memory_get_peak_usage() 的示例输出


 

限制内存使用

确保托管应用程序的服务器不过载的一种方法是限制 PHP 执行的任何脚本使用的内存量。这根本不是我们应当执行的操作,但由于 PHP 是一种松散类型的语言,并且是在运行时解析的,因此我们有时会获得在释放到生产应用程序中后编写得很差的脚本。这些脚本可能执行循环,也可能打开一张长的文件列表,忘记在打开新文件之前先关闭当前文件。无论在哪一种情况下,编写很差的脚本可能在您知道之前以消耗大量内存告终。

PHP.INI 中,您可以使用配制参数 memory_limit 来指定任何脚本能够在系统中运行的最大内存使用量。这不是对于 V5.2 的特定更改,但是内存管理器及其使用的任何讨论都值得至少快速查看一次这个特性。它还精心地引导我使用内存管理器的最后几个新功能:环境变量

上一篇: nginx和php输出wav文件流被截断   下一篇: svn status 返回值详解

提交疑问

回顶部