ファイルにログを記録するスクリプトを見ていきます。
<?php
$delimits = date('Y:m:d:h:i:s')."t";
$delimits.= $_SERVER['SCRIPT_NAME']."t";
$delimits.= $_SERVER['HTTP_REFERER']."t";
$delimits.= $_SERVER['SCRIPT_ACCEPT_LANGUAGE']."t";
$delimits.= $_SERVER['HTTP_USER_AGENT'];
$file = fopen("./logdata/".date("Ymd").".log","a");
flock($file,LOCK_EX);
fputs($file,$delimits."n");
flock($file,LOCK_UN);
fclose($file);
?>
「$delimits = date('Y:m:d:h:i:s')."t";」の「date('Y:m:d:h:i:s')」はアクセス年月日、「$delimits.= $_SERVER['SCRIPT_NAME']."t";」の「$_SERVER['SCRIPT_NAME']」は呼び出されるスクリプト名(スクリプトまでのパス)、「$delimits.= $_SERVER['HTTP_REFERER']."t";」の「$_SERVER['HTTP_REFERER']は「リンク元のURL」、「$delimits.= $_SERVER['SCRIPT_ACCEPT_LANGUAGE']."t";」の「$_SERVER['SCRIPT_ACCEPT_LANGUAGE']」は「クライアントの言語」、「$delimits.= $_SERVER['HTTP_USER_AGENT'];」の「$_SERVER['HTTP_USER_AGENT'];」は「ブラウザの種類」を取得します。
「 $file = fopen("./logdata/".date("Ymd").".log","a");」の「fopen("./logdata /".date("Ymd").".log","a");」でlogdataフォルダに.logという拡張子で「"a"」により追記可能な状態にしています。
「flock($file,LOCK_EX);」は排他処理でファイルをロックしています。これは、ファイルが書き込まれている場合は複数のリクエストがあった場合のファイルの破損を防ぐために記述しています。「fputs($file,$delimits."n");」では指定された文字列を書き込んでいます。「flock($file,LOCK_UN);」は書き込みの処理が終了した後、ファイルのロックを解除するために記述しています。「fclose($file);」は一連の書き込みの処理が終了した後に、ファイルを閉じています。
<?php require_once("log-generation.php"); ?>
<html>
<head>
<title>アクセスログ</title>
</head>
<body>
<h1>
アクセスログ
</h1>
<p>アクセスログを記録しました。</p>
</body>
</html>
「<?php require_once("log-generation.php"); ?>」で「log-generation.php」を呼び出して、ログの記録を行っています。
2008:02:21:04:58:14 /php-programing/2-03/log-generation.php Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
実行結果からそれぞれ取得されていることがわかります。「2008:02:21:04:58:14」は「アクセス年月日」、「/php- programing/2-03/log-generation.php」は呼び出されるスクリプト名(スクリプトまでのパス)、「リンク元のURL」はリンクされる元のURLがこの場合存在していないので、取得はされません。「ja」は「クライアントの言語」、「Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)」は「ブラウザの種類」を表しています。
ここでは、ファイルに書き込んだログを表示するスクリプトを見ていきます。
<?php
if($_GET['dat'] == "") {
$file = fopen("./logdata/".date("Ymd").".log","r");
} else {
$file = @fopen("./logdata/".$_GET['dat'].".log","r")
or $file = fopen("./logdata/".date("Ymd").".log","r");
}
?>
<html>
<head>
<title>アクセスログ表示</title>
</head>
<body>
<h1>
アクセスログ表示
</h1>
<table border="1" cellspacing="0" cellpadding="0" style="width:500px;">
<tr>
<th>アクセス年月日</th>
<th>URL</th>
<th>リンク元URL</th>
<th>言語</th>
<th>使用ブラウザ</th>
</tr>
<?php while($arraydata = fgetcsv($file,300,"\t")) { ?>
<tr>
<?php foreach($arraydata as $data) { ?>
<td><?php echo($data); ?></td>
<?php }?>
</tr>
<?php } ?>
</table>
</body>
</html>
赤い下線の部分のスクリプトでは、クエリ情報datが指定されていない場合は、今日のログファイルを表示し、指定がされている場合は指定されたログファイルを読み取り専用として開きます。
アクセスの表示はテーブルで内行います。「<?php while($arraydata = fgetcsv($file,300,"t")) { ?>」はfgetcsv関数により、ファイルから次の1行を読み込み、指定したタブ文字("t")により分割されています。「300」はその行内で含まれる最大の文字の長さを表しています。そして、最後の行に到達するまで、while文で、ファイル内の行を繰り返し処理しています。
「<?php foreach($arraydata as $data) { ?>」は配列$arraydataから順番に入っている要素を取得し、繰り返しの処理を行っています。取得された要素の値は「$data」に格納されます。ここでは$arraydataに入っている「2008:02:21:06:10:59」や、「/php-programing/2-03 /log-generation.php」がテーブルのセルにそれぞれにわり割り当てられ、「<?php echo($data); ?>」で表示されています。

ファイルに書き込まれている情報が表示されていることがわかります。
バナーをランダムに表示させる
上記3つの構成になっています。
.iniという拡張子のファイルが出てきましたが、これはOSやアプリケーションソフトの設定を記録したファイルの拡張子に使用されます。ここではimageの設定ファイルとして作成し使用します。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>バナーをランダムに表示</title>
</head>
<body>
<?php require_once("follow.php") ?>
</body>
</html>
「<?php require_once("follow.php") ?>」により、follow.phpをインクルードして、バナーを表示します。
[info]
count=4
width=221
height=46
[data]
url1=http://px.xframework.net/
image1=banner01.jpg
alt1=セミナー情報
weight1=50
url2=http://px.xframework.net/
image2=banner02.jpg
alt2=セミナー情報-禁止
weight2=20
url3=http://px.xframework.net/
image3=banner03.jpg
alt3=開発事例
weight3=15
url4=http://px.xframework.net/
image4=banner04.jpg
alt4=開発事例-禁止
weight4=15
見方としては[info]や[data]がセクション名、「count=4」では「count」が「キー名」、「4」が値という具合になります。
「[info]」以下には3つの設定項目が記述されています。「count=4」はバナーの数、「width=221」はバナーの幅、「height=46」はバナーの高さです。
[data] 以下には4つの設定項目があります。「url」はバナーをクリックした飛び先のurl、「image」はバナーの画像が存在する場所のurl(ここではスクリプトと同じディレクトリ内にあるので、バナー名だけを入力しています。)、「alt」は代替テキスト、「weight」はバナーが表示される確率です。
<?php
mt_srand((double)microtime()*100000);
$random = mt_rand(1,100);
$count = 0;
$arrayini = parse_ini_file("random.ini",TRUE);
for($i =1; $i<=$arrayini['info']['count']; $i++) {
if($random > $count && $random <= $count+$arrayini['data']['weight'.$i]) {
echo("<a href='".$arrayini['data']['url'.$i]."'>
<img border='0'
src='".$arrayini['data']['image'.$i]."'
width='".$arrayini['info']['width']."'
height='".$arrayini['info']['height']."'
alt='".$arrayini['data']['alt'.$i]."' />
</a>");
}
$count+=$arrayini['data']['weight'.$i];
}
?>
「mt_srand((double)microtime()*100000);」ではまず、mt_srand関数で乱数生成器を初期化します。次にmicrotime関数により毎回、異なる値を生成しています。microtime関数は現在のUnixタイムスタンプをマイクロ秒まで返します。
「$random = mt_rand(1,100);」のmt_rand関数は改良型乱数値を生成します。ここでは第一引数に1、第二引数に100を入力することにより1~100までの乱数を生成しています。その生成した乱数を変数「$random」に代入しています。
「$count = 0;」は、random.iniに記述された表示確率の値を累積するための変数です。初期の値は0としています。
「$arrayini = parse_ini_file("random.ini",TRUE);」のparse_ini_file関数は iniファイルをロードし、連想配列としてその設定値を返します。ここでは、第一引数に読み込む設定ファイルを記述し、第二引数にはrandom.ini ファイルにある「[info]」や「[data]」のセクションを認識するかどうかの判定を決定します。「TRUE」では$配列名($arrayini)セクション名と設定(キー名)が含まれた多次元の配列を取得することができます。「FALSE」では$arrayini[キー名]が取得されます。
「for($i =1; $i<=$arrayini['info']['count']; $i++) {」~「$count+=$arrayini['data']['weight'.$i]; }」ではバナーがある数(ここでは4つ)だけループ処理を繰り返しています。
「if($random > $count && $random <= $count+$arrayini['data']['weight'.$i]) {」から終了の「}」は「$random = mt_rand(1,100);」で生成された乱数が「$count~$count+」の間にある場合に、該当するweightのバナーを出力する<img />タグを生成します。このとき<img />タグにある幅や高さなどの情報も付随してきます。
「$count+=$arrayini['data']['weight'.$i];」では変数$i番目に表示される確率を変数「$count+」に加算します。




実行結果の画像だけではわかりづらいかもしれませんが、ブラウザの更新を実行する度に上記4つのいずれかのバナー画像がブラウザにランダムで表示されます。