在Linux服务器运维与自动化管理中,PHP作为一种广泛使用的服务器端脚本语言,常用于获取系统信息、执行监控任务或实现自动化运维脚本,本文将详细介绍PHP获取Linux系统信息的多种方法,涵盖命令调用、文件读取、内置函数等场景,并分析其适用场景与注意事项。

PHP执行Linux命令的基础方法
PHP提供了多个内置函数来执行Linux系统命令,通过这些函数可以调用cat、top、df等命令获取系统状态,常用函数包括exec()、shell_exec()、system()和passthru(),它们在返回值和输出方式上存在差异。
exec():执行命令并返回最后一行输出,可通过第二个参数获取完整输出数组,执行exec('uptime', $output),$output将包含系统负载信息。shell_exec():以字符串形式返回命令的全部输出,适合处理连续文本输出,如shell_exec('free -m')可获取内存使用详情。system():直接输出命令结果,并返回最后一行,适合调试场景,但可能影响页面布局。passthru():直接输出原始命令输出(如二进制数据),适用于top等实时命令,但需谨慎使用,避免输出混乱。
注意事项:执行系统命令存在安全风险,需对用户输入严格过滤(如使用escapeshellarg()转义参数),避免命令注入攻击,动态拼接命令时,应避免直接使用$_GET['cmd'],而需通过白名单限制可执行命令范围。
通过读取Linux系统文件获取信息
Linux内核通过/proc虚拟文件系统暴露系统运行时信息,这些文件直接映射内核数据,无需调用外部命令,效率更高且更安全,PHP可通过file_get_contents()或fopen()读取这些文件。
CPU信息
读取/proc/cpuinfo可获取CPU型号、核心数、频率等详细信息。

$cpuinfo = file_get_contents('/proc/cpuinfo');
preg_match_all('/model name\s+:\s+(.+)/', $cpuinfo, $matches);
$cpu_model = $matches[1][0] ?? 'Unknown';
内存信息
/proc/meminfo记录内存总量、可用量、缓存等数据,解析后可计算内存使用率:
$meminfo = file_get_contents('/proc/meminfo');
$mem_data = [];
foreach (explode("\n", $meminfo) as $line) {
if (strpos($line, ':') !== false) {
list($key, $value) = explode(':', $line);
$mem_data[trim($key)] = intval(trim($value));
}
}
$memory_usage = ($mem_data['MemTotal'] - $mem_data['MemAvailable']) / $mem_data['MemTotal'] * 100;
系统负载与运行时间
/proc/loadavg包含1分钟、5分钟、15分钟平均负载;/proc/uptime记录系统启动后的秒数及空闲时间:
$loadavg = file_get_contents('/proc/loadavg');
$load = explode(' ', $loadavg)[0];
$uptime = file_get_contents('/proc/uptime');
$uptime_seconds = intval(explode(' ', $uptime)[0]);
使用PHP内置函数快速获取关键指标
PHP提供了部分内置函数,可直接获取Linux系统信息,无需依赖外部命令或文件,效率更高且安全性更好。
sys_getloadavg():返回系统负载数组(1分钟、5分钟、15分钟),如$loads = sys_getloadavg();- *`posix_
系列函数**:通过POSIX扩展获取进程、用户信息,如posix_getpid()获取当前进程ID,posix_getuid()`获取当前用户ID。 - 磁盘信息函数:
disk_free_space('/')获取根分区剩余空间,disk_total_space('/')获取总空间,可计算磁盘使用率。 php_uname():返回系统名称、版本等信息,如php_uname('s')获取系统类型(如’Linux’)。
这些函数无需额外配置,适合在PHP环境中直接调用,但需确保PHP已启用相应扩展(如posix扩展需在php.ini中开启)。

应用场景示例:服务器监控数据采集
结合上述方法,可构建一个轻量级服务器监控脚本,实时采集CPU、内存、磁盘等数据并格式化输出,以下为简化示例:
function getServerInfo() {
// CPU信息
$cpuinfo = file_get_contents('/proc/cpuinfo');
preg_match('/model name\s+:\s+(.+)/', $cpuinfo, $cpu_match);
$cpu_model = $cpu_match[1] ?? 'Unknown';
// 内存信息
$meminfo = file_get_contents('/proc/meminfo');
$mem_data = [];
foreach (explode("\n", $meminfo) as $line) {
if (preg_match('/^(\S+):\s+(\d+)/', $line, $match)) {
$mem_data[$match[1]] = $match[2];
}
}
$mem_usage = round(($mem_data['MemTotal'] - $mem_data['MemAvailable']) / $mem_data['MemTotal'] * 100, 2);
// 磁盘信息
$disk_free = disk_free_space('/');
$disk_total = disk_total_space('/');
$disk_usage = round(($disk_total - $disk_free) / $disk_total * 100, 2);
// 系统负载
$loadavg = sys_getloadavg();
return [
'cpu_model' => $cpu_model,
'memory_usage' => $mem_usage . '%',
'disk_usage' => $disk_usage . '%',
'load_avg' => $loadavg[0]
];
}
header('Content-Type: application/json');
echo json_encode(getServerInfo());
通过AJAX调用此脚本,可在前端页面实时展示服务器状态,适用于运维监控面板。
注意事项与最佳实践
- 安全性优先:避免直接执行用户输入的命令,对敏感操作(如关机、删除文件)需进行权限校验。
- 性能优化:频繁读取
/proc文件或执行命令可能增加服务器负载,建议使用缓存(如Redis)存储非实时数据。 - 错误处理:文件读取或命令执行可能失败,需添加异常捕获(如
try-catch),并记录错误日志。 - 权限控制:确保PHP运行用户(如
www-data)有读取/proc文件和执行必要命令的权限,避免因权限不足导致获取失败。
通过以上方法,PHP可有效获取Linux系统信息,满足监控、自动化运维等需求,实际应用中,需根据场景选择合适的技术方案,平衡安全性、性能与开发效率,确保系统稳定运行。


















