スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[PHP] カウンタ (画像で表示)



簡易なカウンタです。
データファイルはUTF-8(BOM無し)を想定しています。
(数値ですから、特に意味はないのですが)
リロード防止のため、初回アクセスの際にセッションを生成し、
何か値がセットされていればカウントしないようにしています。

ファイルの読み出しから書き込みまでロックを行っていないのと、
セッションを利用しているため、多くのアクセスがあるサイトには向きません。
同時にアクセスが起こった際に正しくカウントが行えなかったり、
セッションを保持する負荷がかかることが考えられます。

動作条件:
特になし。このサーバは PHP5ですが、4でも問題ないでしょう。


<?php

//セッションを利用
session_start();

//-----------------------------
//設定
//-----------------------------
$file_dat = "./dat/count.dat";
//画像ファイル位置
$dir_img = "./img/";
//画像ファイル名(共通部分)
$file_img = "cnt";
//画像拡張子
$ext_img = ".gif";
//画像を使うか(使う:1)
$use_img = 1;
//空白画像のファイル名の数値部分
$file_null_ch = "n";
//画像の幅・縦
$img_width = 14;
$img_height = 19;

//-----------------------------
//初期化
//-----------------------------
//出力
$buf = "";
//imgタグ src 部分
$img_tag_src = "";

//以前このページにアクセスされたかをセッション変数の内容で確認する
$ses_item = isset( $_SESSION['ses_item'] ) ? $_SESSION['ses_item'] : "";

//カウント数をファイルから取得
$f_buf = file( $file_dat );
$cnt = $f_buf[0];
$cnt = trim( $cnt );
$cnt = str_replace( "\n", "", $cnt );
$cnt = str_replace( "\r", "", $cnt );

//既にアクセスを行っている
if( strlen( $ses_item ) > 0 ){
//更新しない
}
//初アクセス(もしくはアクセスしてからタイムアウトとなる時間が経過している)
else{
//数値として取得できなければ更新しない
if( is_numeric( $cnt ) ){
if( $fp = fopen( $file_dat, 'w') ){
$cnt++;
fwrite( $fp, $cnt );
fclose( $fp );
}
}
//アクセスとしてカウントしたことを示す(中身は何でも良い)
$_SESSION['ses_item'] = "counted";
}

//-------------------------------
//カウンタの表示
//-------------------------------
$str_cnt = str_pad( $cnt, 7, $file_null_ch, STR_PAD_LEFT );
if( $use_img == 1 ){
for( $i = 0; $i < 7; $i++ ){
//一文字ずつ取得
$ch = mb_substr( $str_cnt, $i, 1, "UTF-8" );
//画像に置き換え
$img_tag_src = $dir_img.$file_img.$ch.$ext_img;
$buf .= "<img src=\"".$img_tag_src."\" width=\"".$img_width."\" height=\"".$img_height."\">";
}
}
else{
$buf = $str_cnt;
}

include( "counter.tmpl" );

?>
関連記事
スポンサーサイト

comment

管理者にだけメッセージを送る

検索フォーム
リンク
最新記事
最新コメント
カテゴリ
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。