最近のプロジェクトでは地理的分布情報の表示が必要なため、IP と州および地方自治体の情報をより詳しく理解できます
ユーザーの周囲の情報の取得を実現するために、次の 2 つのソリューションが使用されます
1. IP ライブラリを使用します。純粋な IP ライブラリですが、データベースの更新が遅く、ファイルが大きく、多くのリソースを消費します。
2. open.baidu.com の IPSEARCH サービスを呼び出し、IP138 データベースを使用して、IP が存在する州と都市の情報を取得します。次に、ローカル データベース (ecshop の地域テーブル) を検索して、対応する地域 ID を取得し、関連付けます。 ID を介した関連データ今日試してみたら良い感じだったので実装コードを載せておきます
/**
* IP が存在する都市に関する情報を取得します
* TODO: IP アドレス キャッシュを構築する必要があります
* @param string $ip
*/
function get_city($ip=null) {
import('ORG.Util.Utility')
$d = M('region');
//TODO: ここでキャッシュを構築して都市リストを検索します $cities = $d->where('`regiontype`=2')->select(); ($ip) ? $ip : get_client_ip();
$url = "http://open.baidu.com/ipsearch/s?wd={$ip}&tn=baiduip"; :HttpRequest($ url), 'UTF-8', 'GBK');
if (preg_match('#from:(.+)#Ui', $res, $m) ) {
foreach ( $cities AS $value) {
if ( FALSE !== strpos($m[1], $value['regionname']) ) {
//都市の IP 情報を返す
$array ['c'] =$value;
$array['p']=$d->where('`regionid`='.$value['parentid'])->find(); array;
}
}
}
return array();
}
呼び出しによって返される結果は次のとおりです。 array
'c' =>
'regionid' => 3)
'parentid' => 文字列 '31' (長さ=2)
'regionname' => 文字列 'Jinhua' (長さ=6)
'regiontype' => 文字列 '2' (長さ=1)
'agencyid' => 文字列 ' 0' (length=1)
'ename' =>
array 'regionid' => 31' (長さ=2)
' 親ID' => 文字列 '1' (長さ=1)
'地域名' => 文字列 '浙江省' (長さ=6)
'地域タイプ' => (length=1)
'agencyid' => 文字列 '0' (length=1)
'ename' => 文字列 'zhejiang' (length=8)
IP でテスト済み、情報は非常に正確です、IP138 IPデータベースと123CHA 国内時刻データベースの中では比較的充実したデータベースであり、性能も悪くありません。
http://www.bkjia.com/PHPjc/364599.html
www.bkjia.com