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

PHP 實作:查詢網站地理位置與伺服器作業系統資訊

     編輯:PHP 相關知識

功能概覽

本腳本透過 Socket 連線,整合三大功能:

  1. IP 地理位置查詢:呼叫 ip138.com 解析目標 IP 所在地。
  2. 伺服器軟體識別:發送 HTTP HEAD 請求,從 Server 標頭取得 Web Server 類型與版本。
  3. 連線延遲測試:模擬 Ping 行為,測量 TCP 連線與 HTTP 回應時間。

核心程式碼解析

1. 微秒級計時器

function microtimeFloat() {
    list($usec, $sec) = explode(' ', microtime());
    return (float)$usec + (float)$sec;
}

2. IP 地理位置查詢 (ip138)

function ip138($ip) {
    $host = 'www.ip138.com';
    $fp = @fsockopen($host, 80, $errno, $errstr, 3);
    if (!$fp) return '查詢失敗';

    $request = "GET /ips.asp?ip={$ip} HTTP/1.1\r\n"
             . "Host: {$host}\r\n"
             . "Connection: Close\r\n\r\n";
    @fputs($fp, $request);

    $response = '';
    while ($fp && !feof($fp)) {
        $response .= fread($fp, 1024);
    }
    @fclose($fp);

    // 解析回傳 HTML 表格與列表項目
    $tablePattern = '/<table width="80%" border="0" align="center" cellpadding="0" cellspacing="0">(.*?)<\/table>/is';
    $liPattern = '/<li>(.*?)<\/li>/is';

    preg_match_all($tablePattern, $response, $tables);
    if (empty($tables[1])) return '無資料';

    preg_match_all($liPattern, $tables[1][0], $items);
    return implode(' ', array_slice($items[1], 0, 3)); // 取前三項
}

3. 伺服器軟體偵測

function getServerSoftware($host, $port) {
    $fp = @fsockopen($host, $port, $errno, $errstr, 3);
    if (!$fp) return 'unknown';

    $request = "HEAD / HTTP/1.1\r\n"
             . "Host: {$host}\r\n"
             . "Connection: Close\r\n\r\n";
    @fputs($fp, $request);

    $response = '';
    while ($fp && !feof($fp)) {
        $response .= fread($fp, 1024);
    }
    @fclose($fp);

    $lines = explode("\n", $response);
    foreach ($lines as $line) {
        if (stripos($line, 'Server:') === 0) {
            return '伺服器軟體: ' . trim(substr($line, 7));
        }
    }
    return 'unknown';
}

4. 連線延遲測試

function pingHost($host, $port) {
    $start = microtimeFloat();
    $ip = gethostbyname($host);

    $fp = @fsockopen($host, $port, $errno, $errstr, 1);
    if (!$fp) return "Request timed out from {$ip}";

    $request = "HEAD / HTTP/1.1\r\nHost: {$host}\r\nConnection: Close\r\n\r\n";
    @fputs($fp, $request);
    @fclose($fp);

    $elapsed = ceil((microtimeFloat() - $start) * 1000);
    return "Reply from {$ip}: time={$elapsed}ms";
}

前端介面與整合

腳本包含簡易 HTML 表單,接受域名/IP 與連接埠輸入,送出後依序顯示:地理位置、伺服器軟體、10 次 Ping 測試結果(每秒一次,使用 ob_flush() + flush() 即時輸出)。

安全與限制提醒

  • fsockopen、gethostbyname 等函數在共享主機常被禁用(disable_functions)。
  • 頻繁對外連線可能觸發防火牆封鎖,建議加入快取機制。
  • ip138.com 為第三方服務,穩定性與格式可能變動,生產環境建議改用 IP 歸屬地資料庫(如 MaxMind GeoIP2)。

現代化替代方案

// 使用 cURL 取代 fsockopen,支援 HTTPS、超時控制更完善
$ch = curl_init("https://{$host}:{$port}/");
curl_setopt_array($ch, [
    CURLOPT_NOBODY => true,      // HEAD 請求
    CURLOPT_HEADER => true,      // 包含標頭
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 3,
]);
curl_exec($ch);
$server = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); // 需從 header 解析 Server
curl_close($ch);

本範例展示 PHP 底層網路程式設計基礎,適合學習 Socket 與 HTTP 協定運作;實務專案建議採用成熟的 HTTP Client 函式庫(Guzzle、Httpful)並搭配本地 IP 資料庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved