PHPプロ!TIPSメーリングリスト

┏┏┏―― PHPプロ!Tipsメーリングリスト――――――――――――――
┏┏    
http://www.phppro.jp/ 2007/8/24 号

―――――――――――――――――――――――――――――――――

こんにちは、アシアルの牧野です。
相変わらず厳しい残暑が続いていますが、皆さんいかがお過ごしでしょうか?
昨日、東京は多少涼しくて過ごしやすかったですが、猛暑はまだしばらく続きそうで
す。
あと少し、暑さに負けないでがんばりましょう。

それでは、今週のTIPSのスタートです。

━ 目次 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 1. var_dumpより便利!「HTTPTrace」
 2. IPアドレスから所在地探し
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. var_dumpより便利!「HTTPTrace」

PHPでスクリプトを組むとき、何度も何度も繰り返すことになる作業が、print_r()やvar_dump()による変数の確認です。

例えばWebサイトなどを構築する際などは、var_dump()に調べたい値を渡し、ブラウザをリロードし、表示された画面のソースを表示して正しい値が格納されているかどうかを確認することになります。

これを何度も繰り返すのは非常に面倒な作業なのですが、今回は、こういった変数値の確認を簡単に行えるGUIツール「HTTPTrace」を紹介したいと思います。

まずは公式ページからHTTPTrace本体をダウンロードします。
http://d.hatena.ne.jp/magiwo/20070821

2007年8月22日現在のバージョンは0.1.0のようです。
http://servlet.sakura.ne.jp/download/HTTPTrace-0.1.0.tar.gz

これを解凍すると以下の3つのファイルが現れます。

  • htrace.php
  • sample.php
  • HTTPTraceServer.exe
  • htrace.php はデータの送信元のスクリプトに仕込むライブラリファイル
  • sample.php はHTTPTraceを実行するサンプルスクリプト
  • HTTPTraceServer.exe はスクリプトから送られてくるデータを受信する実行ファイルです。

HTTPTraceは、最初にHTTPTraceServerを実行し、その後PHPスクリプト側から値を送信することになります。

HTTPTraceServer本体はexeファイルから実行するGUIツールなので、Windowsマシン上で実行させます。

私の環境では動作確認用のWindowsマシン(192.168.1.169)と開発用Linuxマシンを使用しているため、HTTPTraceServer.exeをWindowsマシン上に置き、他の二つのファイルをLinuxマシンの適切な場所に置いておきます。

次に、Windowsマシン上においたHTTPTraceServer.exeを実行します。

すると、下の画像のようなGUIツールが立ち上がるので、データを受け取るポート番号を設定し、「Start」ボタンを押します。

HTTPTraceServer

これでデータ受信の準備完了です。

次にデータ送信側の準備をしましょう。

ここではあらかじめ用意されているsample.phpを使うことにします。 このスクリプトの中を見てみると分かりますが、使い方は非常に簡単です。 事前準備は htrace.php をincludeしておき、htrace_set()でHTTPTraceServerの場所を指定するだけです。

あとは var_dump() の代わりに htrace() 関数を使えばよいのです。

それでは、以下のように自分の環境用にsample.phpを書き換えてください。 このスクリプトでは$_SERVER変数をHTTPTraceServerに送ることになります。

sample.php

<?php
require_once "htrace.php";
htrace_set('192.168.1.169'6007);
htrace($_SERVER);
?>

これで送信側の準備も完了です。それでは早速実行してみましょう。

php sample.php

成功すると、Windowsマシン上で実行していたHTTPTraceServerに$_SERVERの値が表示されます。

HTTPTraceServer

各変数名をクリックすると格納されている値が表示され、配列の場合は中身が展開されます。 各変数の値はテキストエリアに表示されるため、値のコピー&ペーストも楽々です。

また、htrace()関数に二つ目の引数として true を渡すと、htrace()が実行された時点でスクリプトの処理を一時中断させることも出来ます。

処理の中断中はHTTPTraceServer上にalertボックスが表示され、「OK」ボタンを押すとスクリプトの処理が再開されます。

<?php
require_once "htrace.php";
htrace_set('192.168.1.169'6007);
htrace($_SERVERtrue);

HTTPTraceServer

allow_call_time_pass_reference が Off に設定されている環境だと警告が表示されるようですが、実行には問題ありません。

PHP開発者には非常に頼もしいツールですので、ぜひ一度使ってみましょう。

2. IPアドレスから所在地探し

IPアドレスから所在地を調べたいと思ったことはありませんか? 今回は、IPアドレスからその場所がどこなのかPHPで調べる方法をご紹介します。

それには、GeoIPライブラリが必要になります。PHPからこのライブラリの機能を使うには、

  1. 1.PEARのNet_GeoIPをインストール
  2. 2.Peclの拡張モジュールをインストール
  3. 3.Apacheのモジュールとしてインストール

という3種類の方法があります。

今回はPeclの拡張モジュールを使います。対象はLinux系OSになります。

1.GeoIPライブラリををインストール

MaxMind社のホームページ(http://www.maxmind.com/)から、GeoIPライブラリをダウンロードし、インストールします。

cd /usr/local/src
wget http://www.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
tar xzvf GeoIP.tar.gz
cd GeoIP
./configure
make
sudo make install
2.GeoIPで使うデータを入手

無料で利用できる国データ、町データをダウンロード、解凍し、配置します。(有料版もあります。)

GeoLite Country
wget http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz -O /usr/local/src/
gunzip /usr/local/src/GeoIP.dat.gz
sudo cp  /usr/local/src/GeoIP.dat /usr/local/share/GeoIP.dat
GeoLite City
wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz -O /usr/local/src/
gunzip /usr/local/src/GeoLiteCity.dat.gz
sudo cp  /usr/local/src/GeoLiteCity.dat /usr/local/share/GeoIPCity.dat
3.Peclモジュールのインストール、設定
sudo pecl install geoip

を実行します。

この時表示されるgeoip.soの場所を確認して下さい。

php.iniに

extension="php/extensions/no-debug-non-zts-20060613/geoip.so"

というようにgeoip.soのパスを追加し、apacheを再起動します。

4.確認

phpinfoを確認して、geoipの項目が表示されていれば成功です。うまくいかなかった時は、データファイルの場所、php.iniのgeoip.soの指定が間違っている可能性があります。

GeoIP関数には何種類かあります(詳細はPHPマニュアルのGeoIP関数を見て下さい)が、一番使えそうなのがgeoip_record_by_name関数です。

引数にホスト名やIPアドレスを指定すると、国、地域、都市名、緯度、経度などの情報を入手できます。

<?php
//ホワイトハウス
var_dump(geoip_record_by_name('whitehouse.gov'));
//東京タワー
var_dump(geoip_record_by_name('www.tokyotower.co.jp'));
//訪問者がどこから来たか
var_dump(geoip_record_by_name($_SERVER['REMOTE_ADDR']));
?>

国しかわからなかったりということもありますが、興味がある人はぜひ使ってみて下さい。