限制内存使用
确保托管应用程序的服务器不过载的一种方法是限制 PHP 执行的任何脚本使用的内存量。这根本不是我们应当执行的操作,但由于 PHP 是一种松散类型的语言,并且是在运行时解析的,因此我们有时会获得在释放到生产应用程序中后编写得很差的脚本。这些脚本可能执行循环,也可能打开一张长的文件列表,忘记在打开新文件之前先关闭当前文件。无论在哪一种情况下,编写很差的脚本可能在您知道之前以消耗大量内存告终。
在 PHP.INI 中,您可以使用配制参数 memory_limit 来指定任何脚本能够在系统中运行的最大内存使用量。这不是对于 V5.2 的特定更改,但是内存管理器及其使用的任何讨论都值得至少快速查看一次这个特性。它还精心地引导我使用内存管理器的最后几个新功能:环境变量。
调整内存管理器
最后,在不能做完美主义者但是又完全符合自己目的的情况下怎样编程?新环境变量 ZEND_MM_MEM_TYPE 和 ZEND_MM_SEG_SIZE 正好可以满足您的需求。
当内存管理器分配大型内存块时,它是安装 ZEND_MM_SEG_SIZE 变量中列出的预定大小执行操作的。这些内存块的默认分区大小为每块 256 KB,但是您可以调整这些分区大小以满足特殊需求。例如,如果您注意到最常用的一个脚本中的操作导致大量的内存浪费,则可以将此大小调整为更接近匹配脚本需求的值,减少分配的内存量但剩下的内存量仍然为零。在正确的条件下,此类谨慎的配制调整可能造成巨大差别。
在 Windows 中检索内存使用情况
如果具有预构建的 PHP Windows 二进制代码,而没有在构建时使用 --enable-memory-limit 选项,则需要先浏览此部分然后再继续。对于 Linux®,配置 PHP 构建时用 --enable-memory-limit 选项构建 PHP。
要使用 Windows 二进制代码检索内存使用情况,请创建以下函数。
清单 3. 在 Windows 下获得内存使用情况
<?php function memory_get_usage(){ $output = array(); exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST', $output ); return preg_replace( '/[^0-9]/', '', $output[5] ) * 1024; } ?>
将结果保存到名为 function.php 的文件。现在您只能将此文件包含在需要使用它的脚本中。