phpは、Webページのサーバサイドプログラム言語としてだけではなく、文字列処理を中心とする様々なデータ処理のための簡易言語として役立つ。
Webへの提供ではない、後者の利用には、コンソールにてphpスクリプトを実行することが多い。 phpのインタプリタは、phpという名前なので、コンソールにて
php (phpスクリプト名)
読み込むデータファイルをコマンドライン引数で
php (スクリプト) aaa bbb ccc
のように与えたとき、スクリプト中で、引数aaa, bbb, cccをゲットするには、変数 $argv
を、引数の数のゲットには $argc
を用いる。(C言語と同様)
サンプルとして
#!/usr/bin/php <?php echo "コマンドライン引数の数:" . $argc . "\n"; for($i=0;$i<$argc;$i++) { echo $i. " : " . $argv[$i] . "\n"; } ?>を試してみてほしい。
BusMap2のログは、richardの /home/common/busmap_log
に置いてある。いくつかを自分の作業場にコピーして、テストしてみてほしい。(1週間ごとに一つのファイルになっており、それぞれが150MB〜200MB、50万行程度ある。)
ログの一部分:
66.249.69.233 - - [26/Feb/2012:04:12:33 +0900] "GET /yamanashi/modules/BusMap2/mobile/route.php?t=55711,55722&tr=1 HTTP/1.1" 200 6593 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.69.233 - - [26/Feb/2012:04:12:34 +0900] "GET /yamanashi/modules/BusMap2/mobile/stoptime.php?time=27951 HTTP/1.1" 500 937 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.69.233 - - [26/Feb/2012:04:12:44 +0900] "GET /yamanashi/modules/BusMap2/mobile/stoptime.php?time=27935&all=1 HTTP/1.1" 500 937 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.67.16 - - [26/Feb/2012:04:12:54 +0900] "GET /yamanashi/modules/BusMap2/mobile/stoptime.php?time=51228&all=1 HTTP/1.1" 500 937 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
各行に、アクセス元のIPアドレス、その後に日時、取得しようとしたサーバ上のファイル(URL)、結果コード、バイト数、ブラウザの種類などが記されている。
このようなファイルから,スクリプト名( stoptime.php
のような)を重複を取り除いて取得するプログラム例を下に示す。
#!/usr/bin/php <?php $filename = $argv[1]; $FP = fopen($filename,"r"); do { $line = fgets($FP); $startpos = strpos($line, "modules/BusMap2/"); /* modules/BusMap2という文字列の位置(最初から何文字目か)調べる */ if(!$startpos) continue; $startpos += 16; /* modulesの"m"から最後の"/"のあとまで16文字 */ $endpos = strpos($line,' HTTP'); /* スクリプト名の最後の文字位置を取得 */ $url = substr($line,$startpos,$endpos-$startpos); /* スクリプト名の部分を切り出し */ if($url=="") continue; $splitedUrl = explode("?",$url); /* "?"で分断して、配列に代入 */ if(!isset($urlname[$splitedUrl[0]])) $urlname[$splitedUrl[0]]=""; /* 未登録なら登録する */ } while(!feof($FP)); foreach($urlname as $n=>$val) { /* 登録されたものを出力 */ if(preg_match("/php$/",$n)) echo $n,"\n"; } ?>
次のログにあるactiontranfer.phpは、携帯むけサービススクリプト(mobileというディレクトリに置かれている)の一つで、URLの引数で時刻(t_hour, t_min, t_type)で出発(到着)時間と発着停留所のIDを指定している。このような行を集計して、どのようなルートの検索をしているかを調べる。
209.85.238.100 - - [11/Mar/2012:04:04:42 +0900] "GET /yamanashi/modules/BusMap2/mobile/actiontransfer.php?t_hour=11&t_min=9&t_type=s&tr=1&s_stop=493&g_stop=160 HTTP/1.1" 302 1486 "-" "DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)"
以下のような行は、パソコンWebページでの検索リクエストの例である。
202.174.57.170 - - [11/Mar/2012:04:04:52 +0900] "GET /yamanashi/modules/BusMap2/routeSearchPlatformsXml.php?startId=1&endId=155&wmax=20&cwmax=10&wmaxAtPlat=30¬ransit=1&stime=16:49 HTTP/1.0" 200 13248 "-" "-"