技术开发 频道

使用PHP 5.2 中新的内存管理器

长期考虑

    正如使用任何语言编写一样,用 PHP 编写的永久性服务器守护程序有很多可能的用途。但是当我们出于这些目的开始使用 PHP 时,我们也必须考虑内存使用情况。

    解析大量数据或可能隐藏无限次循环的脚本都趋于消耗大量内存。很明显,一旦内存被耗尽,服务器的性能就降低,因此在执行脚本时我们还必须注意内存的使用情况。虽然我们可以通过启用系统监视器来简单观察内存的使用量,但是它不会告诉我们比整个系统内存状态更有用的任何内容。有时我们不止需要帮助进行故障检修或优化的内容,而有时我们只是需要更多详细信息。

    获得脚本执行内容的透明性的一种方法是使用内部或外部调试器。内部调试器 是呈现为执行脚本的相同的进程。从操作系统的角度考虑的独立进程是外部调试器。使用调试器进行内存分析类似于任何一种情况,但是使用了不同的方法访问内存。内部调试器对运行进程所在的内存空间具有直接访问权,而外部调试器将通过套接字访问内存。

    有许多方法和可用的调试服务器(外部)和库(内部)可用于辅助开发。为了准备好对 PHP 安装进行调试,可以使用新提供的 --enable-malloc-mm,它在 DEBUG 构建中默认被启用。这使环境变量 USE_ZEND_ALLOC 可用于允许在运行时选择 malloc 或 emalloc 内存分配。使用 malloc-type 内存分配将允许外部调试器观察内存使用情况,而 emalloc 分配将使用 Zend 内存管理器抽象,要求进行内部调试。

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 ?>
0
相关文章