php无法直接获取系统内存使用率,需读取/proc/meminfo并按memtotal−memfree−buffers−cached−sreclaimable计算,注意权限、字段存在性及单位(kb),web环境常见selinux、容器挂载或open_basedir限制。

PHP 怎么拿到当前进程的内存使用量
PHP 本身不提供直接读取物理内存负载(比如系统整体 RAM 使用率)的函数,memory_get_usage() 和 memory_get_peak_usage() 只反映当前 PHP 进程自己申请的内存,和服务器真实内存压力无关。
想监控硬件层内存,得绕过 PHP 自身限制,调用系统命令或读取内核接口。Linux 下最可靠的是读 /proc/meminfo,它由内核实时维护,精度高、无额外依赖。
-
file_get_contents('/proc/meminfo')是最轻量的方式,但注意权限:PHP 运行用户(如 www-data)必须有读取权限,容器环境常因挂载限制或安全策略被拒 - 避免用
shell_exec('free -m')—— 输出格式不稳定(不同版本列数/单位不同),解析易出错;且启动子进程有开销,高频调用会拖慢响应 - 如果用
sys_getloadavg(),它返回的是 CPU 负载均值,和内存完全无关,别混淆
解析 /proc/meminfo 计算内存使用率的正确写法
关键不是“读到”,而是“算对”。很多人直接用 MemTotal 减 MemFree,漏掉 Buffers 和 Cached,导致结果虚高——Linux 把这部分内存视为“可回收”,实际压力远没那么大。
更贴近内核视角的公式是:已用 = MemTotal − MemFree − Buffers − Cached − SReclaimable(SReclaimable 是可回收的 slab 内存,如 dentry/inode 缓存)。
- 务必用正则或逐行扫描提取数值,
MemTotal:后面是 KB 单位,别当成 MB 直接除 - 某些嵌入式或容器系统可能缺
SReclaimable字段,需做存在性判断,否则undefined index报错 - 示例片段:
$meminfo = file_get_contents('/proc/meminfo'); preg_match('/^MemTotal:\s*(\d+)/m', $meminfo, $total); preg_match('/^MemFree:\s*(\d+)/m', $meminfo, $free); preg_match('/^Buffers:\s*(\d+)/m', $meminfo, $buffers); preg_match('/^Cached:\s*(\d+)/m', $meminfo, $cached); preg_match('/^SReclaimable:\s*(\d+)/m', $meminfo, $sreclaim); $used = $total[1] - $free[1] - ($buffers[1] ?? 0) - ($cached[1] ?? 0) - ($sreclaim[1] ?? 0); $rate = round($used / $total[1] * 100, 1); // 百分比
Web 环境下读 /proc/meminfo 的常见失败原因
本地 CLI 模式能跑通,放到 Apache/Nginx + PHP-FPM 就报错,基本逃不开这三类问题:
- SELinux 或 AppArmor 拦截:CentOS/RHEL 默认禁止 web 进程访问
/proc,查ausearch -m avc -ts recent看拒绝日志 - Docker 容器未挂载
/proc:默认只挂载部分,启动时加--privileged风险太大,推荐--mount type=bind,source=/proc,target=/proc,readonly - PHP open_basedir 限制:检查
phpinfo()中open_basedir值,若非空且不含/proc,需在 php.ini 或 vhost 配置里显式追加
要不要每秒轮询内存?PHP 不适合做长期系统监控
PHP 是请求生命周期模型,脚本执行完资源就释放。硬写个 while(true) + sleep(1) 在 Web 环境里不仅会卡住整个 worker,还可能被超时机制 kill 掉(max_execution_time)。
真要持续监控,得交给常驻进程:用 Python/Go 写个 daemon 定期采样,写入 Redis 或本地文件;PHP 接口只负责读取缓存结果。强行让 PHP 扛这事,等于拿螺丝刀当锤子用。
另外提醒一句:/proc/meminfo 里的数字是瞬间快照,没有历史趋势。如果业务需要告警或分析,光靠单次读取毫无意义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











