※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
また、実行に際しては、サーバーでPHPが利用できる事を前提に解説しています。
■ アクセスログの記録
それでは「PHPサンプル」−「アクセス情報の表示」の解説でアクセスログを作成するための予備知識が付きましから、アクセスログを作ってみましょう。
アクセスログに記録するものは次のようなものとします。
1.日付・時刻..サーバーの持つ現在の日時を使用します。
2.表示されたページ ..自サイトの訪問者が見ているページ
3.リファラー(referer)..どのサイトから訪問してきたか、俗に言うリンク元(逆リンクとも言う)。
4.訪問者のエージェント..アクセスをしたときのOS、ブラウザなど。
5.訪問者のIPアドレス..プロバイダから与えられる、世界に1つしかない接続番号のようなもの。
これ以外の情報も記録できますが、もっと知識が増えてからでいいでしょう。
- 【 解 説 】
-
まず、上記にあげた項目をそれぞれ一度変数にセットしておきます。
その記述方法は次の通りです。
$cdate = date("Y/m/d H:i:s", date("U")); $hpadrs = $_SERVER["REQUEST_URI"]; $refer = $_SERVER["HTTP_REFERER"]; $agent = $_SERVER["HTTP_USER_AGENT"]; $ipadrs = $_SERVER["REMOTE_ADDR"];※日時については「PHPの予備知識」−「日付・時刻関数について」や「PHPサンプル」−「アクセス情報の表示」をご参照下さい。
そして、これらをカンマ区切りで羅列し、指定したファイルに追加方式で記録します。
その記述は次の通りです。
$filnam = "./_logs/acclogf.cgi"; $fp = fopen($filnam,"a"); fputs($fp,"$cdate,$hpadrs,$refer,$agent,$ipadrs\n"); fclose($fp); なお、文字列中の最後の「\n」は、ファイル内で使用する改行マークのことです。単純に記録するだけでは動作確認ができませんので、「アクセス情報の表示」で解説した次のような記述を追加し記録内容の表示もしておきます。
print "現在の日時:$cdate<br>\n"; print "表示ページ:$hpadrs<br>\n"; print "リンク元:$refer<br>\n"; print "エージェント:$agent<br>\n"; print "IPアドレス:$ipadrs<br>\n"; print "を記録しました。<br>\n";今回、アクセスログのファイル名は「acclogf.cgi」としました。
このファイル名は何でもいいのですが、セキュリティの意味で拡張子は「.cgi」
にしておくことをお勧めします。このようにしておくと、訪問者がこのファイルを覗こうとした時、自動的にCGIとして実行しようとしますが、中身がCGIではないのでエラーが発生します。
したがって、覗こうとしてもエラーが発生して覗けなくなるからです。
では、上記の内容を使用して「アクセスログ」を作成してみます。
「アクセスログ」は情報を記録するだけで表示はありませんから次のようになります。
なお、今回のサンプルでは排他制御(同時書き込み時の制御)は行っていません。
Windows環境の排他制御については「PHPの予備知識」−「ファイル書き込みの排他制御」をご参照下さい。
- 【記述サンプル】
- print <<< END_DOC <HTML><HEAD> <title>アクセス情報の記録</title> </HEAD><BODY> END_DOC; $cdate = date("Y/m/d H:i:s", date("U")); $hpadrs = $_SERVER["REQUEST_URI"]; $refer = $_SERVER["HTTP_REFERER"]; $agent = $_SERVER["HTTP_USER_AGENT"]; $ipadrs = $_SERVER["REMOTE_ADDR"]; $filnam = "acclogf.cgi"; $fp = fopen($filnam,"a"); fputs($fp,"$cdate,$hpadrs,$refer,$agent,$ipadrs\n"); fclose($fp); print "現在の日時:$cdate<br>\n"; print "表示ページ:$hpadrs<br>\n"; print "リンク元:$refer<br>\n"; print "エージェント:$agent<br>\n"; print "IPアドレス:$ipadrs<br>\n"; print "を記録しました。<br>\n"; print <<< END_DOC </BODY> </HTML> END_DOC; ?>