首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 取得系統與伺服器資訊完整手冊:$_SERVER、環境變數與核心函數

     編輯:PHP 相關知識

核心超全域變數:$_SERVER

$_SERVER 是 PHP 最重要的伺服器環境資訊來源,包含 HTTP 標頭、腳本路徑、執行環境等關鍵資料。

HTTP 請求相關

伺服器與執行環境

鍵名說明範例值備註
REQUEST_METHOD請求方法GET, POST, PUT, DELETERESTful API 必用
REQUEST_URI完整請求 URI/api/users?id=123含查詢字串
QUERY_STRING查詢字串id=123&page=2不含 ?
HTTP_HOSTHost 標頭example.com:8080首選取得域名
HTTP_REFERER來源頁面https://google.com/search?q=php可偽造、不可全信
HTTP_USER_AGENT瀏覽器識別Mozilla/5.0... Chrome/120...裝置偵測依據
HTTP_ACCEPT接受內容型別text/html,application/json內容協商
HTTP_ACCEPT_LANGUAGE偏好語言zh-TW,zh;q=0.9,en;q=0.8多語系偵測
HTTP_AUTHORIZATION認證標頭Bearer abc123需 Apache 設定
CONTENT_TYPE請求內容型別application/jsonPOST/PUT 請求
CONTENT_LENGTH請求內容長度1024位元組數

客戶端資訊

鍵名說明範例值備註
SERVER_SOFTWARE伺服器軟體Apache/2.4.58 (Unix) PHP/8.3.0
SERVER_NAME伺服器主機名example.com設定檔定義,可能非實際域名
SERVER_ADDR伺服器 IP192.168.1.100內網 IP,負載均衡下可能不準
SERVER_PORT伺服器埠號80, 443, 8080
SERVER_PROTOCOL協定版本HTTP/1.1, HTTP/2.0
DOCUMENT_ROOT網站根目錄/var/www/html檔案路徑基準
SCRIPT_FILENAME當前腳本絕對路徑/var/www/html/index.php包含檔名
SCRIPT_NAME當前腳本路徑/index.php相對 DocumentRoot
PHP_SELF當前腳本路徑/index.php含 PATH_INFO,有 XSS 風險
REQUEST_TIME請求開始時間戳1704067200整數秒,PHP 5.1+
REQUEST_TIME_FLOAT請求開始微秒時間1704067200.1234高精度,效能測量首選

關鍵核心函數

鍵名說明範例值
REMOTE_ADDR客戶端 IP203.0.113.45
REMOTE_HOST客戶端主機名host.example.com
REMOTE_PORT客戶端埠號54321
REMOTE_USER認證使用者admin

實用封裝類別:ServerInfo

class ServerInfo {
    public static function getClientIp(): string {
        $headers = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR'];
        foreach ($headers as $header) {
            if (!empty($_SERVER[$header])) {
                $ips = explode(',', $_SERVER[$header]);
                return trim($ips[0]);
            }
        }
        return 'unknown';
    }
    
    public static function getHost(): string {
        return $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'unknown';
    }
    
    public static function getProtocol(): string {
        return (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    }
    
    public static function getFullUrl(): string {
        return self::getProtocol() . '://' . self::getHost() . ($_SERVER['REQUEST_URI'] ?? '/');
    }
    
    public static function isAjax(): bool {
        return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
    }
    
    public static function isHttps(): bool {
        return self::getProtocol() === 'https';
    }
    
    public static function getUserAgent(): string {
        return $_SERVER['HTTP_USER_AGENT'] ?? '';
    }
    
    public static function isMobile(): bool {
        $ua = strtolower(self::getUserAgent());
        $mobileKeywords = ['mobile', 'android', 'iphone', 'ipad', 'phone', 'tablet'];
        foreach ($mobileKeywords as $keyword) {
            if (strpos($ua, $keyword) !== false) return true;
        }
        return false;
    }
    
    public static function getOs(): array {
        return [
            'name' => php_uname('s'),
            'version' => php_uname('r'),
            'arch' => php_uname('m'),
        ];
    }
    
    public static function getPhpInfo(): array {
        return [
            'version' => phpversion(),
            'sapi' => php_sapi_name(),
            'zend' => zend_version(),
            'memory_limit' => ini_get('memory_limit'),
            'max_execution_time' => ini_get('max_execution_time'),
            'upload_max_filesize' => ini_get('upload_max_filesize'),
            'post_max_size' => ini_get('post_max_size'),
        ];
    }
}

安全性注意事項

函數用途回傳值範例
php_uname('s')作業系統名稱Linux, Windows NT, Darwin
php_uname('r')OS 版本5.15.0-91-generic
php_uname('m')硬體架構x86_64, arm64
php_sapi_name()PHP 運行模式fpm-fcgi, cli, apache2handler
phpversion()PHP 版本8.3.2
zend_version()Zend Engine 版本4.3.2
getmypid()當前進程 PID12345
get_current_user()腳本擁有者www-data
memory_get_usage()記憶體使用量2097152 (bytes)
memory_get_peak_usage()記憶體峰值4194304
disk_free_space('/')磁碟剩餘空間10737418240
sys_getloadavg()系統負載[0.52, 0.58, 0.59]

常見應用場景

// 1. 建構標準 API 回應元資料
function apiResponse($data, $meta = []) {
    return json_encode([
        'data' => $data,
        'meta' => array_merge([
            'timestamp' => $_SERVER['REQUEST_TIME_FLOAT'],
            'request_id' => $_SERVER['HTTP_X_REQUEST_ID'] ?? uniqid('req_'),
            'server' => gethostname(),
        ], $meta),
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

// 2. 速率限制識別鍵
$rateLimitKey = 'ratelimit:' . ServerInfo::getClientIp() . ':' . $_SERVER['REQUEST_URI'];

// 3. 多語系自動偵測
function detectLocale(): string {
    $acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'zh-TW';
    $locales = ['zh-TW', 'zh-CN', 'en-US', 'ja-JP'];
    foreach (explode(',', $acceptLang) as $lang) {
        $lang = trim(explode(';', $lang)[0]);
        if (in_array($lang, $locales)) return $lang;
    }
    return 'zh-TW';
}

// 4. 維護模式檢查
if (file_exists(__DIR__ . '/.maintenance') && ServerInfo::getClientIp() !== '192.168.1.100') {
    http_response_code(503);
    die('系統維護中');
}

掌握 $_SERVER 與核心函數,能讓 PHP 程式「感知」執行環境,做出智慧決策:自適應部署、精準日誌、安全防護、效能監控。記住:HTTP 標頭不可信,伺服器變數相對可信,核心函數最可信。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
風險說明防範
HTTP 標頭偽造HTTP_X_FORWARDED_FOR 等可被客戶端竄改僅信任受信任 Proxy 之後的標頭
PHP_SELF XSS<form action="<?= $_SERVER['PHP_SELF'] ?>"> 可注入腳本使用 htmlspecialchars($_SERVER['PHP_SELF']) 或留空 action
資訊洩露錯誤頁面顯示 $_SERVER 內容生產環境關閉 display_errors
內網 IP 洩露SERVER_ADDR 可能洩露內部架構避免在前端輸出