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

PHP 獲取 IP 歸屬地與運營商:基於 ip138 接口的實現方案

     編輯:PHP 相關知識

接口選擇

常用免費 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}" : "查詢失敗"; ?>
  • 關鍵點說明

    1. 編碼轉換:ip138 返回 GB2312 頁面,PHP 內部建議統一 UTF-8,必須 iconv 轉碼後再正則,否則中文匹配失敗。
    2. 錯誤抑制與超時:使用 @ 抑制警告,配合 stream_context_create 設置 5 秒超時,避免外部接口不可用導致腳本卡死。
    3. 正則修飾符:/u 模式正確處理 UTF-8 多字節字符。

    生產環境建議

    • 本地化 IP 庫:高併發場景請勿實時請求第三方 HTTP 接口。下載離線 IP 數據庫(如 ip2region, GeoIP2, 纯真庫)部署在本地或 Redis 中,微秒級查詢。
    • 緩存機制:若必須用 HTTP API,請在 Redis/Memcached 中緩存結果(TTL 1 天以上),IP 歸屬變更極低頻。
    • 異步處理:將 IP 解析放入消息隊列異步執行,不阻塞主業務響應。
    • 備選接口:準備多個接口(ip-api.com, whois.pconline.com.cn 等)實現降級容錯。

    替代方案:ip2region 純 PHP 版

    // composer require zhouaini528/ip2region
    use Zhouaini528\Ip2Region\Ip2Region;
    $searcher = new Ip2Region('ip2region.db');
    $result = $searcher->btreeSearch('218.242.232.194');
    // 返回: ["city_id"=>..., "region"=>"中國|華東|江蘇|蘇州|電信"]
    

    離線庫查詢速度達 10 万次/秒,零網絡依賴,強烈推薦生產環境使用。

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