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

ThinkPHP 獲取客戶端 IP 與 IP 地址查詢完整指南

     編輯:PHP 綜合知識

ThinkPHP 內置 IP 獲取函數

// 正確調用方式(靜態方法調用)
$ip = get_client_ip(); // 返回客戶端 IP 字符串

// 常見錯誤寫法
$ip = $ip->get_client_ip(); // 錯誤!不是對象方法

函數位於框架公共函數庫,自動處理代理頭(HTTP_X_FORWARDED_FOR、HTTP_CLIENT_IP 等),返回真實客戶端 IP。

IP 地址歸屬地查詢:IpLocation 類

類文件位置

ThinkPHP/Lib/ORG/Net/IpLocation.class.php

核心方法

public function getlocation($ip = '')
  • 參數 $ip:可選,默認查詢客戶端 IP
  • 返回值:關聯數組或空值

返回數組結構

$location['ip'];      // 查詢的 IP
$location['country']; // 國家
$location['area'];    // 區域/省市/ISP

使用示例

1. 查詢客戶端 IP 歸屬地

import('ORG.Net.IpLocation');
$ip = new IpLocation();
$location = $ip->getlocation(); // 省略參數自動獲取客戶端 IP

if ($location) {
    echo "國家:{$location['country']}
"; echo "地區:{$location['area']}
"; } else { echo "無法查詢到地址信息"; }

2. 查詢指定 IP/域名歸屬地

import('ORG.Net.IpLocation');
$ip = new IpLocation();

$ipAddr = '202.38.68.68'; // 或域名 'www.example.com'
$location = $ip->getlocation($ipAddr);

// 直接輸出使用
var_dump($location);

底層原理說明

  1. 框架內置 qqwry.dat 純真 IP 數據庫(需確保文件存在)
  2. IpLocation 類實現二分查找索引區,解析記錄區國家/地區信息
  3. 支持 IPv4,不支持 IPv6(需擴展或使用第三方 API)

數據庫更新維護

# 定期下載最新 qqwry.dat 替換框架自帶文件
wget https://update.cz88.net/soft/qqwry.rar
unrar x qqwry.rar
cp qqwry.dat ThinkPHP/Lib/ORG/Net/

建議設置定時任務每月更新一次,保證查詢準確性。

性能優化建議

  • 緩存查詢結果:相同 IP 短時間內重複查詢無意義,用 Redis/Memcache 緩存 24 小時
  • 異步查詢:頁面渲染不依賴地址信息時,AJAX 異步獲取
  • 批量查詢:日誌分析等場景批量處理,避免逐個查詢

擴展:接入第三方高精度 API

內置數據庫精度有限(僅到市/ISP 級),高精度需求(街道級)建議接入:

  • 高德/騰訊/百度地圖 IP 定位 API
  • MaxMind GeoIP2(需賬號、付費版精度更高)
  • ipapi.co / ipinfo.io 等國際服務

總結

ThinkPHP 提供了開箱即用的 get_client_ip() 和 IpLocation 類,滿足基礎 IP 獲取與歸屬地查詢需求。生產環境注意數據庫更新、查詢緩存、高精度場景接入第三方 API 三大要點。

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