<?php
/*            day counter by TOMO
----------------------------------------------
                    Usage
----------------------------------------------
以下の関数でカウント値を出力します
- counter_total(arg1, arg2)
- counter_today(arg1, arg2)
- counter_yesterday(arg1, arg2)
    arg1 : 0(text) or 1(image) (default:0)
    arg2 : digit (default:0)
画像を使用する場合は./imgディレクトリ内に
0.gif, 1.gif,,, 9.gifを用意して下さい。
----------------------------------------------
                  Example
----------------------------------------------
//使用するファイルの先頭でinclude()して下さい
include("./daycount.php");
echo "Today:";
counter_today(0, 3);
echo "Yesterday:";
counter_yesterday(0, 3);
echo "Total:";
counter_total(0, 5);
---------------------------------------------
Last Modified : 2002/05/04(Sat)

*2002/05/04: クッキーの不具合修正

*/

//設定
$COUNTER_CFG['main_log']      = "./log/countlog.txt";
$COUNTER_CFG['history_log']   = "./log/history.txt"//省略可
$COUNTER_CFG['image_dir']     = "./img"//画像を使う場合
$COUNTER_CFG['enable_flock']  = TRUE//flock()する時
//$COUNTER_CFG['enable_flock']  = FALSE; //flock()しない時
$COUNTER_CFG['enable_cookie'] = TRUE//クッキーに二重カウント防止
//$COUNTER_CFG['enable_cookie'] = FALSE; //クッキーを使わないとき

//配列インデックスの定義
define("TOTAL",     0);
define("TODAY",     1);
define("YESTERDAY"2);
define("DAY",       3);
define("MONTH",     4);
define("YEAR",      5);
define("WEEK",      6);
define("TAIL",      7);
//クッキー名
define("COOKIE_NAME""PHP_DAYCOUNT2");

//関数の定義
function file_lock($fp)
{
    global 
$COUNTER_CFG;

    if (!
$COUNTER_CFG['enable_flock']) return TRUE;

    if (
flock($fp6)) {
        return 
TRUE;
    } else {
        
sleep(1);
        if (
flock($fp6)) {
            return 
TRUE;
        } else {
            
fclose($fp);
            return 
FALSE;
        }
    }
}

function 
file_unlock($fp)
{
    global 
$COUNTER_CFG;

    if (!
$COUNTER_CFG['enable_flock']) return TRUE;

    return 
flock($fp3);
}

//データ出力用関数
function counter_data($mode$digit$DATA)
{
    global 
$COUNTER_CFG;

    if (
$mode == 1) { //画像の場合はIMGタグを出力
        
for($i $digit$i >= 1$i--) {
            
$n substr(sprintf("%010d"$DATA), -1*$i1);
            
$file $COUNTER_CFG['image_dir']."/".$n.".gif";
            
$size getimagesize($file);
            echo 
"<IMG ".$size[3]." src=\"".$file."\">";
            
//alt属性入れるなら
            //echo "<IMG ".$size[3]." src=\"".$file."\" alt=\"".$n."\">";
        
}
    } else {  
//テキスト出力の場合
        
echo sprintf("%0".$digit."d"$DATA);
    }
}

//トータルカウント表示用
function counter_total($mode=0$digit=0)
{
    global 
$NEW_DATA;
    
counter_data($mode$digit$NEW_DATA[TOTAL]);
}

//本日のカウント表示用
function counter_today($mode=0$digit=0)
{
    global 
$NEW_DATA;
    
counter_data($mode$digit$NEW_DATA[TODAY]);
}

//昨日のカウント表示用
function counter_yesterday($mode=0$digit=0)
{
    global 
$NEW_DATA;
    
counter_data($mode$digit$NEW_DATA[YESTERDAY]);
}

//メインの計算部分
function counter_calc()
{
    global 
$COUNTER_CFG$HTTP_COOKIE_VARS;

    if (!(
$fp = @fopen($COUNTER_CFG['main_log'], "r+")) || !file_lock($fp)) {
        return array(
0000000);
    }

    
//データ読み込み
    
$temp fgets($fpfilesize($COUNTER_CFG['main_log']) + 1);
    
rewind($fp);

    
//今日の日付を取得(日本時間)
    
$now   time() + 9*3600;
    
$day   gmdate("d"$now);
    
$month gmdate("m"$now);
    
$year  gmdate("Y"$now);
    
$week  gmdate("D"$now);

    if (
$temp == "") { //ファイルが空だった場合に初期化
        
$DATA = array(000$day$month$year$week);
    } else {
        
$DATA explode(","$temp);
    }

    if (
$COUNTER_CFG['enable_cookie'] && isset($HTTP_COOKIE_VARS[COOKIE_NAME])) {
        
//クッキーの取得
        
$COOKIE explode(":"$HTTP_COOKIE_VARS[COOKIE_NAME]);

        if (
$day == $DATA[DAY] && $month == $DATA[MONTH] && $year  == $DATA[YEAR]) {
            if (
$COOKIE[DAY] == $day) {
                
//同じ日の処理
                
$NEW_DATA = array($COOKIE[TOTAL], $COOKIE[TODAY], $COOKIE[YESTERDAY],
                                  
$DATA[DAY], $DATA[MONTH], $DATA[YEAR], $DATA[WEEK]);
            } else {
                
//日付が変ったが直後ではない場合
                
$NEW_DATA = array($COOKIE[TOTAL], 0$COOKIE[TODAY],
                                  
$DATA[DAY], $DATA[MONTH], $DATA[YEAR], $DATA[WEEK]);
            }
        } else {
            
//日付が変った直後の処理
            
$NEW_DATA = array($DATA[TOTAL], 0$DATA[TODAY],
                              
$day$month$year$week);
            
//履歴を記録
            
if ($fp2 = @fopen($COUNTER_CFG['history_log'], "a")) {
                
fputs($fp2implode(","$DATA)."\n");
                
fclose($fp2);
            }

            
//メインログに記録
            
fputs($fpimplode(","$NEW_DATA).",");

            
//表示用にはクッキーの値を使用する
            
$NEW_DATA[TOTAL]     = $COOKIE[0];
            
$NEW_DATA[YESTERDAY] = $COOKIE[1];
        }
    } else {
        if (
$day == $DATA[DAY] && $month == $DATA[MONTH] && $year  == $DATA[YEAR]) {
            
//同じ日の処理
            
$NEW_DATA = array($DATA[TOTAL] + 1$DATA[TODAY] + 1$DATA[YESTERDAY],
                              
$DATA[DAY], $DATA[MONTH], $DATA[YEAR], $DATA[WEEK]);
        } else {
            
//日付が変った直後の処理
            
$NEW_DATA = array($DATA[TOTAL] + 11$DATA[TODAY],
                              
$day$month$year$week);
            
//履歴を記録
            
if ($fp2 = @fopen($COUNTER_CFG['history_log'], "a")) {
                
fputs($fp2implode(","$DATA)."\n");
                
fclose($fp2);
            }
        }

        
//メインログに記録
        
fputs($fpimplode(","$NEW_DATA).",");

        
//クッキー発行
        
if ($COUNTER_CFG['enable_cookie']) {
            
$cookie_var implode(":"$NEW_DATA);
            @
setcookie(COOKIE_NAME$cookie_var0""""0);
        }
    }
    
file_unlock($fp);
    
fclose($fp);
    return 
$NEW_DATA;
}
$NEW_DATA counter_calc();
?>