日期:2014-05-17  浏览次数:20386 次

php 5.2 内存管理器

?

PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器

像跟踪和监视 uber-nerd 一样跟踪和监视 PHP 内存

Tracy Peterson (tracy@tracypeterson.com ), 自由撰稿人, Consultant

简介: ?了解如何使用 PHP V5.2 中引入的新内存管理器并开始精通于跟踪和监视内存使用情况。这将使您可以在 PHP V5.2 中更加有效地使用更多的内存。

查看本系列更多内容

标记本文!

发布日期: ?2007 年 4 月 10 日
级别: ?中级
访问情况 ?1145 次浏览
建议: ?0?(添加评论 )

1 star 2 stars 3 stars 4 stars 5 stars 平均分 (共 2 个评分 )

PHP V5.2:开始

2006 年 11 月发布了 PHP V5.2,它包括许多新增功能和错误修正。它废止了 5.1 版并被推荐给所有 PHP V5 用户进行升级。我最喜欢的实验室环境 —— Windows?、Apache、MySQL、PHP (WAMP) —— 已经被引入了 V5.2 的新软件包中(请参阅 参考资料 )。您将在那里找到在 Windows? XP 或 2003 计算机上安装 PHP V5.2、MySQL 和 Apache 的应用程序。您可以十分轻松地进行安装,它有很多不错的小的管理优点,并且我十分诚恳地推荐使用它。

虽然对于 Windows 用户来说,这是最简单的软件包,但是在 Linux 上配置 PHP 时您需要添加以下代码:--memory-limit-enabled (适用于您服务器的任何其他选项除外)。不过,在 Windows 下,提供了一个解决此问题的函数。

PHP V5.2 中有很多改进之处,并且一个至关重要的领域是内存管理。从 README.ZEND_MM 中准确地引述就是:“新内存管理器(PHP5.2 以及更高版本)的目标是减少内存分配开销并加速内存管理。”

下面是 V5.2 发行说明中的一些关键内容:

  • 删除了不必要的 --disable-zend-memory-manager 配置选项
  • 添加了 --enable-malloc-mm 配置选项,调试构建时此配置选项将被默认启用以允许使用内部和外部内存调试程序
  • 允许使用 ZEND_MM_MEM_TYPEZEND_MM_SEG_SIZE 环境变量调整内存管理器

为了理解这些新增功能的含义,我们需要深入研究内存管理中的艺术,并考虑为什么分配开销和运行速度是大问题。


为什么进行内存管理?

计算中开发最快速的一项技术是内存和数据存储,它们是受不断增加速度和存储大小这样持续的需求而驱动的。早期的计算机使用 卡作为内存,然后转向了芯片技术。您能想象在只有 1 KB RAM 内存的计算机工作的情景吗?很多早期的计算机程序员就曾使用过。这些先驱者很快就意识到,要在技术限制下工作,他们将必须细心地用琐碎的命令避免系统过 载。

身为 PHP 开发人员,与使用 C++ 或其他更严格的语言编码的同事相比,我们所在的环境更方便进行编码。在我们的世界里,我们自己不必担心如何处理系统内存,因为 PHP 将为我们处理这个问题。但是,在其他编程领域里,负责任的编码人员将使用各种函数确保执行的命令不会覆盖其他一些程序数据 —— 因而,破坏了程序的运行。

内存管理通常是由来自编码人员的请求处理的,以分配和释放内存块。分配块 可以保存任何类型的数据,并且此过程将为该数据隔开一定量的内存,并当操作需要访问数据时为应用程序提供访问方法。人们期望程序在完成任何操作后释放分配的内存,并允许系统和其他程序员使用该内存。如果程序没有把内存释放回系统,则称为内存泄露

泄露是任何运行程序都存在的普遍问题,并且某种程度内通常是可以接受的,尤其是当我们知道运行程序将立即终止并释放默认分配给程序的所有内存。

由于随机运行和终止程序,像几乎所有客户机应用程序一样,这是个问题。期望服务器应用程序不确定地运行而不终止或重新启 动,这使得内存管理对于服务器守护程序编程绝对的至关重要。在长时间运行的程序中,即使一个小的泄露最后都将发展为系统衰弱问题,因为内存块已被使用并且 永远不被释放。


长期考虑

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

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

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