常用免費 IP 歸屬地查詢接口有 ip138、ip-api、淘騰 IP 庫等。本文以 ip138 (www.ip138.com) 為例,演示服務端爬取解析 HTML 頁面獲取歸屬信息的方法。
<?php
/**
* 獲取 IP 歸屬地及運營商信息
* @param string $ip 目標 IP 地址
* @return string|false 歸屬字符串或失敗返回 false
*/
function GetArea($ip) {
$url = "https://www.ip138.com/ips8.asp?ip={$ip}&action=2";
// 設置較短超時,防止阻塞
$ctx = stream_context_create(['http' => ['timeout' => 5]]);
$contents = @file_get_contents($url, false, $ctx);
if ($contents === false) return false;
// 頁面編碼為 GB2312,需轉碼處理正則
$contents = iconv('GB2312', 'UTF-8//IGNORE', $contents);
// 正則提取 本站主數據:...< /li>
if (preg_match('/<li>本站主數據:(.*?)<\/li>/u', $contents, $m)) {
return trim($m[1]);
}
return false;
}
// 設置輸出編碼
header('Content-Type: text/html; charset=UTF-8');
// 測試
$ip = '218.242.232.194';
$area = GetArea($ip);
echo $area ? "IP {$ip} 歸屬: {$area}" : "查詢失敗";
?>
iconv 轉碼後再正則,否則中文匹配失敗。@ 抑制警告,配合 stream_context_create 設置 5 秒超時,避免外部接口不可用導致腳本卡死。/u 模式正確處理 UTF-8 多字節字符。// composer require zhouaini528/ip2region
use Zhouaini528\Ip2Region\Ip2Region;
$searcher = new Ip2Region('ip2region.db');
$result = $searcher->btreeSearch('218.242.232.194');
// 返回: ["city_id"=>..., "region"=>"中國|華東|江蘇|蘇州|電信"]
離線庫查詢速度達 10 万次/秒,零網絡依賴,強烈推薦生產環境使用。