ちょっと悩んだところは、桁数の決まっている数字だけをカウントログファイルに書き込む分には問題ないのですが、IP アドレスも書き込むと、IP アドレスによって文字数が違ってくる。そうすると前の書き込みを削除してから書き込まないと、前の IP アドレスが次に書き込まれる IP アドレスより長い場合、[前の IP アドレスの文字数] - [次に書き込まれる IP アドレスの文字数] で出た文字数分の文字が次に書き込まれる IP アドレスのお尻に繋がって残ってしまうと言うことでした。perl では前の書き込みを削除するには truncate(**,0) としてあげればよいので、同じように書いてみましたがだめでした。しかたなく一度読みモード (r) でカウントログファイルを開いて閉じ、その後ファイルサイズを 0 にしてから書き込むモード (w+) で開いて書き込むようにしら上手く行きましたが、何となくスマートでありません。
少し間があってから、PHP のマニュアルを見ていましたら、PHP では perl のような truncate(**,0) ではなく、ftruncate(**,0) だと分かり下記のスクリプトのようにスマートになりました。(^^;)
$ip = getenv("REMOTE_ADDR");
$logfile = "count.log";
$fp = fopen($logfile,"r+") or die("指定されたログファイルがないか、パーミッションを間違えているかです");
$count = fgets($fp);
list($logcnt,$logip) = split( ":", $count);
ftruncate($fp,0);
if ($ip == $logip){$cnt = $logcnt;}
else {$cnt = $logcnt + 1;}
$data = implode(":", array($cnt,$ip));
rewind($fp);
flock($fp, LOCK_EX);
fputs($fp, $data);
fclose($fp);
echo $cnt;
?>
少し間があってから、PHP のマニュアルを見ていましたら、PHP では perl のような truncate(**,0) ではなく、ftruncate(**,0) だと分かり下記のスクリプトのようにスマートになりました。(^^;)
$ip = getenv("REMOTE_ADDR");
$logfile = "count.log";
$fp = fopen($logfile,"r+") or die("指定されたログファイルがないか、パーミッションを間違えているかです");
$count = fgets($fp);
list($logcnt,$logip) = split( ":", $count);
ftruncate($fp,0);
if ($ip == $logip){$cnt = $logcnt;}
else {$cnt = $logcnt + 1;}
$data = implode(":", array($cnt,$ip));
rewind($fp);
flock($fp, LOCK_EX);
fputs($fp, $data);
fclose($fp);
echo $cnt;
?>
コメント