PHP アクセスログ プログラム 生ログ風 WordPressにも組み込み方法
問題点
レンタルサーバ「ConoHa WING」でアクセスログの生ログを見たかったのですが見れる期間が短く、Wordpressの脆弱性を狙ってきているものの動きを見るには不便だったので、生ログ風のシンプルなアクセスログを残せるものが必要になった。
WordPressのプラグインも検討したが、そちらを入れると余分な機能が入ったりなど、トータルでページを重くなる原因になるので、PHPで自分が欲しいシンプルなものを作ることにした。
PHP 簡単アクセスログ
<?php
//保存するフォルダ(相対パス)
$directory='accsesslog/';
//日時取得
$time=date("Y/m/d H:i:s");
//ユーザーのipアドレスを取得
$user_id=$_SERVER["REMOTE_ADDR"];
if(!isset($_SERVER["REMOTE_HOST"])||$_SERVER["REMOTE_HOST"]==""){
$_SERVER["REMOTE_HOST"]=gethostbyaddr($_SERVER['REMOTE_ADDR']);
}
//ユーザーのホスト名を取得
$user_host=$_SERVER["REMOTE_HOST"];
//ユーザーのポートを取得
$user_port=$_SERVER["REMOTE_PORT"];
if(empty($_SERVER["HTTPS"])){
$url='http://';
}else{
$url='https://';
}
//アクセス先URL取得
$url .=urldecode($_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]);
$url='"'.$url.'"';
$request=$_SERVER["REQUEST_METHOD"];
//元URLを取得
if(!isset($_SERVER['HTTP_REFERER'])||$_SERVER['HTTP_REFERER']==""){
$motourl="empty";
}else{
$motourl = urldecode($_SERVER['HTTP_REFERER']);
}
if($user_id == "0.0.0.0"){
}elsif($user_id == "0.0.0.0"){
}else{
$motourl='"'.$motourl.'"';
//ファイル出力
$fp = fopen($directory.date("YmdH").'.txt', "a");
//一応文字コード指定
$str = mb_convert_encoding($time.','.$user_id.','.$user_host.','.$user_port.','.$url.','.$request.','.$motourl."\n", "UTF-8");
fwrite($fp,$str);
// ファイルを閉じる
fclose($fp);
}
PHPのプログラム自体は上記のようになるが、プログラムを動かくす前に、相対パスで、「accsesslog」というディレクトリーの作成が必要です。作成を忘れると、fopenの所で、「failed to open stream: No such file or directory」のエラーがでます。
require('log.php');
使い方は、シンプルにPHPファイルの最初のように、上記の内容を入れれば、PHPファイルに読み込まれ実行されます。WordPressに組み込む場合は、子テーマのヘッダー部分のPHPを記載するところに入れれば、WordPressでも実行できます。
プログラムの解説(重要部分のみ)
「$directory」これは、アクセスログを保存するディレクトリー(相対パス)になります。ここは、あまり人に見られたいところではないので、ログ関係だと連想されにくい名称の方がいいです。
「$time=date(“Y/m/d H:i:s");」ここで、現在の時間を取得。
「$user_id=$_SERVER[“REMOTE_ADDR"];」ここの部分でアクセス元のIPアドレスを取得。
「$url .=urldecode($_SERVER[“HTTP_HOST"].$_SERVER[“REQUEST_URI"]);」ここの部分で、接続されているページのURLを取得。
「if($user_id == “0.0.0.0"){」ここのIPアドレスを入れると、そのIPアドレスの情報は取得しなくなります。
「}elsif($user_id == “0.0.0.0"){」2つ目以降のIPアドレスは、このようなelsifで追加していくと対応ができます。わかる人は普通に配列での処理に変更してもらった方が処理は早くなると思います。
「$fp = fopen($directory.date(“YmdH").’.txt’, “a");」ここで、出力ファイル名を決定。2024年5月13日2時の場合は、「2024051302.txt」となります。1時間に1個テキストファイルを出力する形式になっています。CSV形式のため、拡張子をCSVにしても可。アクセス数が多いページは、このログが飛ぶ場合や、処理がしきれずにログが記載されない場合があります。また、1時間に1個のテキストファイルにしているのは、アクセスログが小さいほうが処理が早くなったり、前記のような問題が少しでも出にくくするためです。
「$str = mb_convert_encoding($time.’,’.$user_id.’,’.$user_host.’,’.$user_port.’,’.$url.’,’.$request.’,’.$motourl."\n", “UTF-8");」ここで、CSV形式のテキスト形式を決める。
オススメ記事
問題点 テーマにもよるが、通常WordPressのウィジェッ…
WordPress 記事に挿入する画像のリンク先を自動入力…
問題点 WordPressの記事作成時に、サイトによっては、…
Luxeritasでアイキャッチ画像を記事内に表示する方法…
問題点 WordPressのテーマ、「Luxeritas」の…
ディスカッション
コメント一覧
まだ、コメントがありません