運維診斷、兼容性檢測、安裝向導等場景常需獲取服務器詳細環境信息。本文封裝一個 getSystemInfo() 函數,涵蓋作業系統、PHP、Web 服務器、擴展庫、關鍵配置等 15+ 維度信息,返回結構化數組便於展示或 API 輸出。
<?php
/**
* 獲取服務器系統綜合信息
* @return array 結構化信息數組
*/
function getSystemInfo() {
$info = [];
// 1. 作業系統
$info['os'] = PHP_OS; // 如 Linux, WINNT, Darwin
// 2. PHP 核心版本
$info['php_version'] = PHP_VERSION;
$info['php_sapi'] = PHP_SAPI; // cli, fpm-fcgi, apache2handler 等
// 3. Web 服務器版本 (僅 Apache 環境可用)
if (function_exists('apache_get_version')) {
$info['apache_version'] = apache_get_version();
} else {
$info['apache_version'] = 'N/A (非 Apache 或無權限)';
}
// 4. Zend Engine 版本
$info['zend_version'] = zend_version();
// 5. GD 庫支援檢測
if (function_exists('gd_info')) {
$gd = gd_info();
$info['gd_support'] = true;
$info['gd_version'] = $gd['GD Version'];
$info['gd_freetype'] = $gd['FreeType Support'] ?? false;
$info['gd_jpeg'] = $gd['JPEG Support'] ?? false;
$info['gd_png'] = $gd['PNG Support'] ?? false;
} else {
$info['gd_support'] = false;
$info['gd_version'] = '未安裝或未啟用';
}
// 6. 關鍵 PHP 配置項
$configKeys = [
'safe_mode' => '安全模式',
'register_globals' => '註冊全局變量',
'magic_quotes_gpc' => '魔術引用 GPC',
'file_uploads' => '文件上傳支援',
'upload_max_filesize' => '最大上傳文件',
'post_max_size' => '最大 POST 數據',
'max_execution_time' => '最大執行時間(秒)',
'memory_limit' => '內存限制',
'display_errors' => '顯示錯誤',
'error_reporting' => '錯誤報告級別',
'date.timezone' => '默認時區',
];
foreach ($configKeys as $iniKey => $label) {
$val = ini_get($iniKey);
// memory_limit 可能為 -1 (無限制)
if ($iniKey === 'memory_limit' && $val === '-1') $val = '無限制';
$info[str_replace('.', '_', $iniKey)] = $val ?: 'Off/未設置';
}
// 7. 關鍵擴展檢測
$extensions = [
'pdo', 'pdo_mysql', 'mysqli', 'curl', 'mbstring', 'json', 'xml',
'openssl', 'zip', 'gd', 'redis', 'memcached', 'opcache', 'bcmath'
];
$info['extensions'] = [];
foreach ($extensions as $ext) {
$info['extensions'][$ext] = extension_loaded($ext) ? phpversion($ext) : false;
}
// 8. 磁盤空間 (當前項目目錄)
$info['disk_free_space'] = @disk_free_space('.');
$info['disk_total_space'] = @disk_total_space('.');
$info['disk_usage_percent'] = $info['disk_total_space']
? round((1 - $info['disk_free_space'] / $info['disk_total_space']) * 100, 1)
: 'N/A';
return $info;
}
// 使用示例
$sysInfo = getSystemInfo();
echo "<pre>";
print_r($sysInfo);
echo "</pre>";
// 或 JSON 輸出供前端/API 使用
// header('Content-Type: application/json');
// echo json_encode($sysInfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>
Array
(
[os] => Linux
[php_version] => 8.2.10
[php_sapi] => fpm-fcgi
[apache_version] => N/A (非 Apache 或無權限)
[zend_version] => 4.2.10
[gd_support] => 1
[gd_version] => bundled (2.1.0 compatible)
[gd_freetype] => 1
[gd_jpeg] => 1
[gd_png] => 1
[safe_mode] => Off
[register_globals] => Off
[magic_quotes_gpc] => Off
[file_uploads] => On
[upload_max_filesize] => 50M
[post_max_size] => 100M
[max_execution_time] => 30
[memory_limit] => 256M
[display_errors] => Off
[error_reporting] => 32767
[date_timezone] => Asia/Shanghai
[extensions] => Array
(
[pdo] => 8.2.10
[pdo_mysql] => 8.2.10
[mysqli] => 8.2.10
[curl] => 8.2.10
[mbstring] => 8.2.10
[json] => 8.2.10
[xml] => 8.2.10
[openssl] => 8.2.10
[zip] => 8.2.10
[gd] => 8.2.10
[redis] => 5.3.7
[memcached] => 3.2.0
[opcache] => 8.2.10
[bcmath] => 8.2.10
)
[disk_free_space] => 10737418240
[disk_total_space] => 53687091200
[disk_usage_percent] => 80.0
)
<!DOCTYPE html>
<html>
<head>
<title>服務器環境信息</title>
<style>
table {border-collapse: collapse; width: 100%; max-width: 800px; margin: 20px auto;}
th, td {border: 1px solid #ddd; padding: 10px; text-align: left;}
th {background: #f5f5f5;}
.status-ok {color: green;} .status-warn {color: orange;} .status-no {color: red;}
</style>
</head>
<body>
<h1 style="text-align:center">服務器環境診斷報告</h1>
<table>
<tr><th>項目</th><th>值</th><th>狀態/說明</th></tr>
<?php foreach ($sysInfo as $key => $val):
if (is_array($val)) continue; // 擴展列表單獨處理
?>
<tr>
<td><?= $key ?></td>
<td><?= is_bool($val) ? ($val ? 'Yes' : 'No') : $val ?></td>
<td><?= getHint($key, $val) ?></td>
</tr>
<?php endforeach; ?>
</table>
<h3>PHP 擴展支援情況</h3>
<table>
<tr><th>擴展</th><th>版本/狀態</th></tr>
<?php foreach ($sysInfo['extensions'] as $ext => $ver): ?>
<tr>
<td><?= $ext ?></td>
<td class="<?= $ver ? 'status-ok' : 'status-no' ?>">
<?= $ver ? $ver : '未安裝/未啟用' ?>
</td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
這個函數是「環境即代碼」理念在 PHP 運維中的輕量級落地,集成到項目中能顯著提升故障排查與環境驗證效率。