本腳本透過 Socket 連線,整合三大功能:
Server 標頭取得 Web Server 類型與版本。function microtimeFloat() {
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
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)); // 取前三項
}
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';
}
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)。// 使用 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 資料庫。