PHPでアクセスカウンタを作る(1)

こんにちは。
最近はPHP講座の更新しかしていなかったので、今回はそれ以外のネタでいこうかと思います。

と、いうことでアクセスカウンタを作ってみます。

アクセスカウンタは様々なところで見かけると思いますが、アクセス数をカウントして表示するあれです。
アクセスカウンタの作成にはPHPファイル以外にアクセス数を記録しておくファイル、またはデータベースが必要です。
今回は手軽な、ファイル書き込みでアクセス数を記録する方法で作ってみたいと思います。

準備するもの

  • count.php : 実行ファイル
  • count.txt : カウント

count.txtのパーミッションは606に設定してください。
(※PHPからの書き込み許可が必要なため)

count.txtには初期値を半角数字で記述し、保存しておきます。

ファイルを開く

PHPからファイルを開くのは簡単に出来ます。
fopen()を利用します。

//count.phpとcount.txtが同一ディレクトリにある場合
//ファイル名(ファイルパス)
$filename = "count.txt";
//モード(公式マニュアル参照)
$mode = "r+";
//読み込み・書き込みでファイルを開く
$file_pointer = fopen($filename, $mode);

→公式マニュアル:fopen()

ファイルをロックする

ファイルを開いた後はロックを行ないます。
これは、編集中にcount.txtが変更されないようにするものです。

//$file_pointerはfopen()で取得したポインタ
//LOCK_EXは書き手としてのロックを示す
if(flock($file_pointer, LOCK_EX)){
	//ここで書き込み処理

	//ロック解除
	flock($file_pointer, LOCK_UN);
}else{
	echo "ファイルロックに失敗しました。";
}

→公式マニュアル:flock()

flock()はロックできた場合にTRUEを返すので、ロックできた場合のみ処理を行ないます。

ファイルの内容を取得

ファイルから数字を読み込みます。
これはfget()という関数を利用します。

//読み込む最大バイト数(+1)
$max_byte = 65;
//$file_pointerから64バイトまたは改行、ファイル末尾まで取得する
$count = fgets($file_pointer, $max_byte);
//値がない場合、または数字じゃない場合0をセット
if(!isset($count) or !is_numeric($count)){
	$count = 0;
}
//1つカウントアップする
$count ++;

→公式マニュアル:fgets()

ファイルに書き込む

ファイルに書き込む処理を行ないます。
その際、どこに値が書き込まれるかには注意しなければなりません。
読み込み処理によってポインタが移動している場合、予期しない場所に書き込まれることがあるので、書き込み前にrewind()という関数を利用します。

//ファイルポインタの位置を先頭に戻す
rewind($file_pointer);
//ファイル書き込み処理
fwrite($file_pointer, $count);

→公式マニュアル:rewind(),fwrite()

ファイルを閉じる

ここまでできれば、後はロックの解除を行なって、ファイルを閉じるだけです。
ロック解除はロック時同様、flock()を利用します。
ファイルを開く際はfopen()を使用しましたが、閉じる際はfclose()を利用します。

//ロック解除
flock($fp, LOCK_UN);

//ファイルを閉じる
fclose($file_pointer);

→公式マニュアル:fclose()

こんな感じです。

完成

全体的にはこのようになります。

<?php
//@をつけることで開けなかった際にエラーが出ない。
$file_pointer = @fopen("./count.txt","r+");
//ロックを行なう
if(flock($file_pointer, LOCK_EX)){
	//64バイト、改行、ファイル末尾まで取得
	$count = fgets($file_pointer, 65);
	if(!isset($count) or !is_numeric($count)){
		//値がない場合、または数字じゃない場合0をセット
		$count = 0;
	}
	//カウントアップ
	$count++;
	//ポインタを先頭に持ってくる。
	rewind($file_pointer);
	//書き込み処理
	fwrite($file_pointer, $count);
	//アンロック
	flock($file_pointer, LOCK_UN);
}else{
	//ロック失敗
	echo "ファイル読み込みに失敗しました。";
}
//ファイルを閉じる
fclose($file_pointer);

//カウンタ表示
echo "アクセス:" .$count;
?>

以上です。
あとは、これを表示したい場所でinclude()したりすれば「アクセス:100」みたいに表示されます。
※多重カウント防止などの処理は行なっていません。

この機能に「〇〇の場合カウントアップする。」といったルールを追記すれば、独特のカウンターが作れると思います。
では、また。

…思ったんだけど、公式マニュアルって分かりにくいよね。。。

  1. コメント 0

  1. トラックバック 0

return top