在 PHP 中,获取进程的内存占用和进行内存监控是服务器性能优化和故障排查中非常重要的一部分。PHP 本身并没有提供直接的函数来获取系统的内存占用信息,但你可以通过一些操作系统的命令和 PHP 的内置函数来获取这些数据。

以下是 4 个常用的 PHP 函数 或方法,用于获取和监控进程的内存占用。

1. memory_get_usage()

memory_get_usage() 是 PHP 内置的一个函数,用来获取当前 PHP 脚本的内存占用。它返回当前脚本分配的内存量(以字节为单位)。如果你需要获取脚本运行过程中的内存变化,可以多次调用该函数。

使用示例:

<?php
// 获取当前脚本的内存占用(字节数)
echo "当前内存使用: " . memory_get_usage() . " 字节";

// 获取真实内存使用情况(即包括 PHP 内部内存管理的内存)
echo "真实内存使用: " . memory_get_usage(true) . " 字节";
?>
  • memory_get_usage():返回当前脚本的内存占用。
  • memory_get_usage(true):返回真实的内存占用(包括 PHP 内部内存管理的占用)。

限制:

  • 该函数只能返回当前脚本的内存占用,不支持监控其他进程的内存占用。

2. memory_get_peak_usage()

memory_get_peak_usage() 返回脚本执行过程中的 内存峰值,即脚本运行期间使用的最大内存量。这个函数对于调试脚本内存占用情况特别有用。

使用示例:

<?php
// 获取脚本运行期间的最大内存使用量
echo "内存峰值使用: " . memory_get_peak_usage() . " 字节";

// 获取真实内存使用的最大值
echo "真实内存峰值使用: " . memory_get_peak_usage(true) . " 字节";
?>
  • memory_get_peak_usage():返回脚本执行期间的最大内存使用量。
  • memory_get_peak_usage(true):返回真实的内存峰值(包括 PHP 内部内存管理的占用)。

3. getrusage()

getrusage() 是一个系统调用函数,可以用来获取当前进程的 资源使用情况,其中包括内存、CPU 时间等信息。这个函数返回的是进程资源的统计信息,包括 用户空间使用的 CPU 时间系统空间使用的 CPU 时间,以及 内存信息

getrusage() 函数主要是用来监控当前脚本的资源使用,而不像前两个函数那样返回内存的绝对大小。

使用示例:

<?php
// 获取当前进程的资源使用情况
$usage = getrusage();

// 输出 CPU 时间等资源使用情况
echo "用户 CPU 时间: " . $usage["ru_utime.tv_sec"] . " 秒\n";
echo "系统 CPU 时间: " . $usage["ru_stime.tv_sec"] . " 秒\n";
echo "最大 RSS (内存): " . $usage["ru_maxrss"] . " KB\n";
?>
  • ru_maxrss:返回进程的最大内存占用,单位通常是 KB(不同平台返回的单位可能不同)。
  • ru_utime 和 ru_stime:分别表示用户和系统空间的 CPU 时间。

注意:

  • getrusage() 返回的信息包含了很多资源使用的统计信息,其中 ru_maxrss 对应的是进程的内存峰值。

4. sys_getloadavg()

sys_getloadavg() 函数返回系统负载信息,包含 过去 1 分钟、5 分钟和 15 分钟 的平均负载。这并不是直接监控内存,但它能帮助我们判断系统的资源负载状态。

使用示例:

<?php
// 获取系统负载信息
$load = sys_getloadavg();

echo "过去 1 分钟的负载: " . $load[0] . "\n";
echo "过去 5 分钟的负载: " . $load[1] . "\n";
echo "过去 15 分钟的负载: " . $load[2] . "\n";
?>

注意:

  • sys_getloadavg() 返回的负载信息并不直接表示内存占用,而是系统的 CPU 使用负载,虽然它与内存占用也有间接关系。

5. 通过外部命令获取系统内存信息

虽然 PHP 没有直接的内存监控 API,但你可以通过执行操作系统命令来获取进程或系统的内存信息。常用的命令有 topps(Linux 系统)或 tasklist(Windows 系统)。通过 PHP 的 exec() 或 shell_exec() 函数执行这些命令可以获取详细的内存信息。

5.1 Linux 下获取进程的内存使用情况

使用 ps 命令可以获取进程的内存使用情况,例如:

ps aux --sort=-%mem | head -n 10

该命令显示按内存占用排序的前 10 个进程。

5.2 PHP 执行 ps 命令获取内存信息

<?php
// 获取系统中内存使用前 10 的进程信息
$output = shell_exec("ps aux --sort=-%mem | head -n 10");

// 输出
echo "<pre>$output</pre>";
?>

5.3 Windows 下获取进程的内存使用情况

在 Windows 系统上,使用 tasklist 命令来查看所有进程的内存使用情况:

tasklist

然后可以通过 PHP 执行此命令并解析输出:

<?php
// 获取 Windows 系统中的进程内存占用情况
$output = shell_exec("tasklist");

// 输出
echo "<pre>$output</pre>";
?>

6. 总结

在 PHP 中,获取进程的内存占用信息可以通过以下几种方法:

  1. memory_get_usage():获取当前脚本的内存占用。
  2. memory_get_peak_usage():获取当前脚本的最大内存占用。
  3. getrusage():获取当前进程的资源使用情况,包括内存。
  4. sys_getloadavg():获取系统的负载信息,间接反映 CPU 和内存的使用情况。

此外,你还可以通过执行系统命令如 ps(Linux)或 tasklist(Windows)来获取更详细的内存占用信息。