部署、遷移、排查兼容性問題時,需要快速獲取服務器關鍵環境信息。本文封裝一個 getSystemInfo() 函數,涵蓋操作系統、PHP 版本、Web 服務器、Zend、GD 庫、關鍵 php.ini 參數、上傳/內存限制等,返回結構化數組,可直接用於後台儀表盤、安裝向導、健康檢查 API。
<?php
/**
* 獲取服務器系統信息
* @return array 結構化信息數組
*/
function getSystemInfo(): array {
$info = [];
// 1. 操作系統
$info['os'] = PHP_OS; // Linux, Darwin, WINNT 等
// 2. PHP 版本
$info['php_version'] = PHP_VERSION;
$info['php_sapi'] = PHP_SAPI; // fpm-fcgi, cli, apache2handler 等
// 3. Web 服務器版本 (僅 Apache SAPI 可用)
if (function_exists('apache_get_version')) {
$info['apache_version'] = apache_get_version();
} elseif (isset($_SERVER['SERVER_SOFTWARE'])) {
$info['server_software'] = $_SERVER['SERVER_SOFTWARE']; // Nginx/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'] ?? 'unknown';
$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;
}
// 6. 關鍵 php.ini 安全/功能參數
$info['ini'] = [
'safe_mode' => (bool)ini_get('safe_mode'), // 已棄用 PHP 5.4+
'register_globals' => (bool)ini_get('register_globals'), // 已移除 PHP 5.4+
'magic_quotes_gpc' => (bool)ini_get('magic_quotes_gpc'), // 已移除 PHP 5.4+
'magic_quotes_runtime'=> (bool)ini_get('magic_quotes_runtime'),// 已移除 PHP 5.4+
'allow_url_fopen' => (bool)ini_get('allow_url_fopen'),
'allow_url_include' => (bool)ini_get('allow_url_include'),
'display_errors' => (bool)ini_get('display_errors'),
'log_errors' => (bool)ini_get('log_errors'),
'error_reporting' => ini_get('error_reporting'),
'max_execution_time' => (int)ini_get('max_execution_time'),
'memory_limit' => ini_get('memory_limit'),
'post_max_size' => ini_get('post_max_size'),
'upload_max_filesize' => ini_get('upload_max_filesize'),
'max_file_uploads' => (int)ini_get('max_file_uploads'),
'date.timezone' => ini_get('date.timezone'),
'session.save_handler'=> ini_get('session.save_handler'),
'session.save_path' => ini_get('session.save_path'),
];
// 7. 擴展加載狀態 (常用擴展檢測)
$required_exts = ['pdo', 'pdo_mysql', 'mysqli', 'mbstring', 'json', 'xml', 'curl', 'openssl', 'zip', 'redis', 'memcached', 'gd', 'bcmath', 'intl'];
foreach ($required_exts as $ext) {
$info['extensions'][$ext] = extension_loaded($ext);
}
// 8. 磁盤空間 (當前腳本所在分區)
$info['disk'] = [
'total' => @disk_total_space('.'),
'free' => @disk_free_space('.'),
];
return $info;
}
// 使用示例
$sys = getSystemInfo();
echo '<pre>'; print_r($sys); echo '</pre>';
// 或 JSON 輸出供前端/監控系統
// header('Content-Type: application/json'); echo json_encode($sys, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>
Array
(
[os] => Linux
[php_version] => 8.2.10
[php_sapi] => fpm-fcgi
[server_software] => nginx/1.24.0
[zend_version] => 4.2.10
[gd_support] => 1
[gd_version] => bundled (2.1.0 compatible)
[gd_freetype] => 1
[gd_jpeg] => 1
[gd_png] => 1
[ini] => Array
(
[safe_mode] =>
[register_globals] =>
[allow_url_fopen] => 1
[memory_limit] => 256M
[post_max_size] => 64M
[upload_max_filesize] => 32M
...
)
[extensions] => Array
(
[pdo] => 1
[pdo_mysql] => 1
[redis] => 1
[memcached] =>
...
)
[disk] => Array
(
[total] => 21474836480
[free] => 10737418240
)
)
| 場景 | 用法 |
|---|---|
| 安裝向導環境檢查 | 前端調用 API,綠色/紅色提示必需/推薦擴展、配置是否滿足要求 |
| 後台儀表盤「系統信息」頁 | 定時緩存 1 小時,管理員查看 PHP 版本、擴展、磁盤、內存限制 |
| 跨服務器部署一致性驗證 | CI/CD 階段調用,對比多台服務器關鍵參數 (memory_limit, max_execution_time, 擴展列表) 是否一致 |
| 故障排查快照 | 異常捕獲時自動附加 getSystemInfo() 到日誌/郵件,快速定位環境差異導致的 Bug |
| 兼容性測試矩陣 | 收集不同 PHP 版本/OS/SAPI 下的函數行為差異數據 |