监控您 PHP 应用的 RAM 使用情况可能很有用,尤其是如果您注意到运行算法时内存消耗过高。

您正在生产服务器上运行一个 Symfony 应用程序,突然在您漂亮的 Grafana 仪表板上注意到内存使用量激增。

您已确定问题的原因,并且能够在本地开发服务器上复现它。

现在你想要知道你的脚本执行过程中消耗了多少内存:PHP 有内置函数可以做到这一点!

让我们看看 memory_get_usage()memory_get_peak_usage()

  • memory_get_usage

此函数的实现如下:

memory_get_usage(bool $real_usage = false): int

real_usage 参数可以用来获取不同的值:

  • true 将返回由 Zend 引擎内存管理器使用的内存,因此是 PHP 进程实际使用的内存。
  • false 将返回运行脚本所使用的内存。

如果您想知道一个函数调用使用了多少内存,使用实际使用量是没有用的,但对于基准测试来说很有用!

  • memory_get_peak_usage()

此函数具有与 memory_get_usage 相同的参数 real_usage

返回值将是执行所需的最高内存。

每个函数的使用场景是什么?

这是一个高内存消耗算法的示例

<?php

$array = [];

for ($i = 1; $i < 10000; $i++) {
    $array[] = substr(sha1((string) $i), 0, 15);

    if ($i % 1000 === 0) {
        echo 'Usage: ' . memory_get_usage() / 1024 / 1024 . ' MBs' . PHP_EOL;
    }
}

echo 'Peak usage: ' . memory_get_peak_usage() / 1024 / 1024 . ' MBs';

生成随机字符串并将它们推入数组——PHP 8.1 这是此脚本的输出(PHP 8.1):

Usage: 0.44483184814453 MBs
Usage: 0.51425933837891 MBs
Usage: 0.61490631103516 MBs
Usage: 0.65305328369141 MBs
Usage: 0.81620025634766 MBs
Usage: 0.85434722900391 MBs
Usage: 0.89249420166016 MBs
Usage: 0.93064117431641 MBs
Usage: 1.2187881469727 MBs
Peak usage: 1.2569732666016 MBs

现在您已经知道如何使用这些函数,您可以在任何时间调试您的应用程序并查看其内存消耗!