If you're having trouble making the GeoIP PHP functions recognise the location of your GeoIP database, the following block of code will show you all the directories in which the PHP functions are looking... so you'll need to shift your files around to suit it:
<?php
print_r( geoip_db_get_all_info() );
?>
and it'll output an array of 13 or so elements, looking something like this:
Array
(
[1] => Array
(
[available] => 1
[description] => GeoIP Country Edition
[filename] => /usr/share/GeoIP/GeoIP.dat
)
[2] => Array
(
[available] => 1
[description] => GeoIP City Edition, Rev 1
[filename] => /usr/share/GeoIP/GeoIPCity.dat
)
[3] => Array
(
[available] =>
[description] => GeoIP Region Edition, Rev 1
[filename] => /usr/share/GeoIP/GeoIPRegion.dat
)
.. and so on.
"available" will be 1 when the GeoIP file has been found and loaded.
NOTE: if you download the GeoLiteCity.dat.gz file from MaxMind, just decompress it and rename it to GeoIPCity.dat and use the GEOIP_CITY_EDITION_REV1 constant and it'll work fine in PHP.
XLVIII. GeoIP 関数
導入
GeoIP 拡張モジュールを使用すると、IP アドレスの場所を探すことができます。 市、州、国、経度、緯度そして ISP や接続方式などの情報が GeoIP を用いて取得できます。
要件
この拡張モジュールを使用するには、GeoIP C ライブラリのバージョン 1.4.0 以降がインストールされていなければなりません。最新のバージョンは http://www.maxmind.com/app/c から取得できるので、これをコンパイルします。
デフォルトでは、Free GeoIP Country データベースあるいは GeoLite City データベースにしかアクセスできません。 しかし、それ以外のデータベースを使用することも可能です。その場合には Maxmind から商用ライセンスを購入しなければなりません。
インストール手順
この PECL 拡張 モジュールは PHP にバンドルされていません。
この PECL 拡張モジュールをインストールする方法は、 マニュアルの PECL 拡張モジュールのインストール という章にあります。 新規リリース・ダウンロード・ソースファイル・管理者情報・CHANGELOG といった関連する情報については、次の場所にあります。 http://pecl.php.net/package/geoip.
リソース型
リソース型は定義されていません。
定義済み定数
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
- GEOIP_COUNTRY_EDITION (integer)
- GEOIP_REGION_EDITION_REV0 (integer)
- GEOIP_CITY_EDITION_REV0 (integer)
- GEOIP_ORG_EDITION (integer)
- GEOIP_ISP_EDITION (integer)
- GEOIP_CITY_EDITION_REV1 (integer)
- GEOIP_REGION_EDITION_REV1 (integer)
- GEOIP_PROXY_EDITION (integer)
- GEOIP_ASNUM_EDITION (integer)
- GEOIP_NETSPEED_EDITION (integer)
- GEOIP_DOMAIN_EDITION (integer)
以下の定数は、ネット接続のスピードを表します。
- 目次
- geoip_country_code_by_name -- 二文字の国コードを取得する
- geoip_country_code3_by_name -- 三文字の国コードを取得する
- geoip_country_name_by_name -- 完全な国名を取得する
- geoip_database_info -- GeoIP データベースの情報を取得する
- geoip_id_by_name -- インターネット接続のスピードを取得する
- geoip_org_by_name -- 組織名を取得する
- geoip_record_by_name -- GeoIP データベースで見つかった詳細な都市情報を返す
- geoip_region_by_name -- 国コードおよび地域を取得する
Hello,
While trying to update the GeoIP.dat file under debian, I've found out that automatic updates via the geoipupdate (in geoip-bin package) is not available for the free edition. Here is a one-liner script that will do it. You can put it in a crontab, it will download the .dat file only if it has change :
cd /usr/share/GeoIP && wget GEOIP_URL -N && cat GeoIP.dat.gz | gzip -d > GeoIP.dat
Note : GEOIP_URL is to be found on the page http://www.maxmind.com/app/geoip_country, under the Binary Format section (The php note system won't allow me to put the full URL here
Crontab line could be :
@weekly cd /usr/share/GeoIP && (..)
The GeoLiteCity free db works and can resolve city names and other informations.
Make sure the instructions are followed regarding it's installation.
http://www.maxmind.com/app/installation?city=1
At step 2 the decompress file must be moved and renamed.
The files needs to be called GeoIPCity.dat if not the mod_geoip will not find it.
you can use this function to determine the continent of a country:
function getContinentFromCountry($country)
{
$data = array ("AF"=> "AS","AX"=>"EU","AL"=>"EU", "DZ"=>"AF","AS"=>"OC", "AD"=>"EU","AO"=> "AF" ........);
return $data[$country];
}
unfortunately this comment's size is restricted, so you will have the rest by yourself
for example:
getContinentFromCountry("DE") will result in "EU"
this data is based on
wikipedia's
List_of_countries_by_continent_(data_file)
For Debian etch users : libgeoip is in version 1.4 so get the source from lenny (apt-get build-dep libgeoip;apt-get source libgeoip), compile it on etch (dpkg-buildpackage -rfakeroot in source folder) and install resulting libgeoip1 and libgeo-dev packages (dpkg -i)... Together with php5-dev this package is easy to install (phpize5;./configure --enable-geoip;make;make install)... Then check your install in php with :
<?php
echo geoip_database_info(GEOIP_COUNTRY_EDITION);
echo $_SERVER['REMOTE_ADDR'];
echo geoip_country_code3_by_name($_SERVER['REMOTE_ADDR']);
?>
please note free .dat is in /usr/share/GeoIP/GeoIP.dat
Use geoip-bin package to schedule automatic updates (configure /etc/geoip.default.conf and copy to /etc/geoip.conf, then add a crontab to make the updates...)
hope this helps
Just to clarify the other comments, the maxmind post seems to be out of date / incorrect.
This module fails to work (ie: resolve cities) with the GeoLite City database from here:
http://www.maxmind.com/app/geolitecity
The error occurs when calling the function geoip_record_by_name(), which states incorrectly that the required database is not available. I have tested it with the very latest database, for which geoip_database_info() returns the version:
GEO-533LITE 20070601 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved
It does, however, resolve countries OK via the GeoLite Country database, which you can grab here: http://www.maxmind.com/app/geoip_country
I tested with the version:
GEO-106FREE 20070601 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved
The geoip_country_*_by_name functions only work with GeoIP Country. The geoip_record_by_name function works with GeoIP City. geoip_region_by_name works with GeoIP Region. So the API should work with all of the GeoIP databases, as long as you call the correct function.
I couldn't get it to work with the DMA code database (product ID 137). It seems to only work with the country database. The documentation should contain a warning that this code (as of 0.2.0) is incomplete and that Net_GeoIP should be used for non-country databases.
If you want to use this extension in SUSE/openSUSE, it is available here:
http://repos.opensuse.org/server:/php:/extensions/
Both, Ubuntu and Debian itself make usage of version 1.3.x of the c libraries, so installation can't be done with the debian packages, because configure stops with:
== configure: error: You need version 1.4.0 or higher of the C API ==
so you must download it from maxmind.
If you are a Debian or Ubuntu user, instead of building it from source, you can:
aptitude install libgeoip-dev libgeoip1
