BusMap2ログおよび処理スクリプトのサンプル

ファイルを読み込んで、文字列の処理を行うスクリプトのTips

phpは、Webページのサーバサイドプログラム言語としてだけではなく、文字列処理を中心とする様々なデータ処理のための簡易言語として役立つ。

Webへの提供ではない、後者の利用には、コンソールにてphpスクリプトを実行することが多い。 phpのインタプリタは、phpという名前なので、コンソールにて

    php (phpスクリプト名)

とすればよい。(Windowsでも、コマンドプロンプトで同様にできるが、Linuxのコンソールの方が機能が豊富なので扱いやすい。)

読み込むデータファイルをコマンドライン引数で 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";
  }

?>
を試してみてほしい。

access_logの処理プログラム例

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&notransit=1&stime=16:49 HTTP/1.0" 200 13248 "-" "-"