可通过读取/proc/meminfo、执行free命令、结合memory_get_usage与sys_getloadavg、解析/proc/self/status,或在Windows下调用WMI来获取PHP服务器内存使用情况。

如果您需要在PHP脚本中获取当前服务器的内存使用情况,则可以通过读取系统文件或调用系统命令的方式直接访问底层信息。以下是几种可行的方法:
一、读取/proc/meminfo文件(Linux系统)
Linux系统将内存信息以文本形式暴露在/proc/meminfo中,PHP可通过file_get_contents读取并解析该文件,提取MemTotal、MemFree、MemAvailable等关键字段。
1、使用file_get_contents读取/proc/meminfo内容。
2、使用preg_match匹配MemTotal:后的数值(单位为kB)。
立即学习“PHP免费学习笔记(深入)”;
3、使用preg_match匹配MemAvailable:(若存在)或MemFree:后的数值。
4、将MemTotal与MemAvailable相减,得到已使用内存字节数,并换算为MB或GB。
二、执行free命令并解析输出
通过exec或shell_exec调用free -m命令,可直接获得以MB为单位的内存摘要,避免手动换算,适用于对/proc权限受限但允许命令执行的环境。
1、调用shell_exec('free -m 2>/dev/null')获取命令输出。
2、按行分割输出结果,定位第二行(即Mem行)。
3、使用空格或制表符分割该行,提取第2列(total)、第3列(used)、第4列(free)数值。
4、确认输出非空且数值为数字,否则返回错误标识。
三、使用sys_getloadavg配合memory_get_usage(仅限进程级参考)
memory_get_usage()返回当前PHP进程占用的内存字节数,而sys_getloadavg()提供系统平均负载;二者结合虽不能反映全局内存,但可用于监控脚本自身内存增长趋势及系统整体压力。
1、调用memory_get_usage(true)获取分配给当前脚本的总内存量(含未释放碎片)。
2、调用sys_getloadavg()获取过去1/5/15分钟系统平均负载数组。
3、将memory_get_usage()结果除以1024再除以1024,转换为MB并保留两位小数。
4、注意:此方法不反映系统总内存或剩余内存,仅适用于诊断PHP进程内存行为。
四、使用posix_getsid与/proc/self/status(Linux进阶方式)
通过读取/proc/self/status可获取当前PHP进程的VmRSS(实际物理内存占用),再结合/proc/meminfo估算系统级比例;该方式精度高于memory_get_usage,但仍属进程维度。
1、读取/proc/self/status内容。
2、正则匹配VmRSS:[[:space:]]+([0-9]+) kB提取当前进程物理内存(kB)。
3、同时读取/proc/meminfo中MemTotal字段值。
4、计算VmRSS占MemTotal的百分比,结果保留一位小数。
五、检查系统平台并自动选择适配方法
为增强兼容性,应先判断PHP运行环境是否为Linux,再决定启用/proc或free方案;若为Windows,则需改用com_dotnet扩展调用WMI接口查询Win32_OperatingSystem类的TotalVisibleMemorySize与FreePhysicalMemory属性。
1、使用PHP_OS_FAMILY或strncasecmp(PHP_OS, 'WIN', 3) === 0判断是否为Windows。
2、Linux环境下优先尝试读取/proc/meminfo,失败则降级执行free命令。
3、Windows环境下检查com_dotnet扩展是否启用,未启用则返回不可用提示。
4、Windows路径下必须确保Web服务器进程具有WMI查询权限,否则将抛出拒绝访问异常。



















