在開發運維監控系統或後台管理介面時,經常需要即時獲取伺服器的 CPU、記憶體、磁碟使用率以及進程資訊。本文分享一個基於 PHP 封裝的函數,透過呼叫 Linux 系統指令(top、df、date)來獲取伺服器核心效能指標,適合整合至自建監控儀表板或健康檢查 API 中。
函數 get_used_status() 主要執行以下步驟:
top -b -n 2 以批次模式輸出兩次採樣(首次採樣數據通常不準),配合 grep 擷取 Cpu、Mem、Tasks 開頭的行。df -lh 列出本地掛載點,正則清理多餘空格後提取可用空間(GB)與使用率百分比。date 指令取得當前時間戳。cpu_usage、mem_usage、hd_avail、hd_usage、tast_running、detection_time 六個鍵值。function get_used_status() {
// 1. 獲取 CPU、記憶體、進程資訊
$fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"', "r");
$rs = "";
while (!feof($fp)) {
$rs .= fread($fp, 1024);
}
pclose($fp);
$sys_info = explode("\n", $rs);
// 解析進程、CPU、記憶體行(索引視實際輸出調整)
$task_info = explode(",", $sys_info[3]); // 進程
$cpu_info = explode(",", $sys_info[4]); // CPU
$mem_info = explode(",", $sys_info[5]); // 記憶體
// 運行中進程數
$task_running = trim(str_replace('running', '', $task_info[1]));
// CPU 使用率(去除單位字符)
$cpu_usage = trim(str_replace(['Cpu(s): ', '%us'], '', $cpu_info[0]));
// 記憶體使用率計算
$mem_total = (int)str_replace(['Mem: ', 'k total'], '', $mem_info[0]);
$mem_used = (int)str_replace('k used', '', $mem_info[1]);
$mem_usage = round(100 * $mem_used / $mem_total, 2);
// 2. 磁碟使用率
$fp = popen('df -lh | grep -E "^(/)"', "r");
$rs = fread($fp, 1024);
pclose($fp);
$rs = preg_replace("/\s{2,}/", ' ', $rs);
$hd = explode(" ", $rs);
$hd_avail = str_replace('G', '', $hd[3]); // 可用空間 (GB)
$hd_usage = str_replace('%', '', $hd[4]); // 使用率
// 3. 檢測時間
$fp = popen('date +"%Y-%m-%d %H:%M"', "r");
$detection_time = trim(fread($fp, 1024));
pclose($fp);
// 4. 返回結果
return [
'cpu_usage' => $cpu_usage,
'mem_usage' => $mem_usage,
'hd_avail' => $hd_avail,
'hd_usage' => $hd_usage,
'task_running' => $task_running,
'detection_time'=> $detection_time,
];
}
top、df、date 指令的權限;若在禁用 popen 的環境下,可改用 exec() 或 shell_exec() 並注意過濾輸出。top 輸出格式在不同 Linux 發行版(CentOS、Ubuntu、Debian)間可能略有差異,建議先在目標環境測試並調整陣列索引。/proc/stat、/proc/meminfo 直接讀取核心數據,避免啟動子進程,提升響應速度。這段代碼提供了一個輕量、無第三方依賴的伺服器狀態獲取方案,適合中小型專案快速接入監控功能。對於大規模叢集環境,建議採用 Prometheus + Node Exporter 等專業監控棧以獲得更豐富的指標與歷史趨勢分析能力。