PHP を使用した Web ページの毎日のヒット カウンターを実験するために書いています。
同じ日に同じブラウザからの複数のアクセスを 1 としてカウントする必要があります。これを行うために、私は Cookie を使用しています。
問題は、ブラウザが Cookie を取得する前に、スレッドが Cookie を見つけることなく、スクリプトを複数回並行して実行できるため、カウンターが期待どおりに機能しないことです。
では、同じブラウザからのリクエストを処理するためにスクリプトが並行して実行されないようにするにはどうすればよいでしょうか?
ありがとう。
以下に例を示します: デバッグを容易にするために、1 日の長さが 1 分になっていることに注意してください:D、
カウンターは左から 2 番目の値です。
http://ralfralf.atwebpages.com/index2.php
ここにコードがあります:(誰かがそれを読みやすくするのを手伝ってくれますか?):D
<?php
$visitsfile = file("visits.txt");
if( ! isset($_COOKIE["visitor"] ) )
{
$rest = time() % 60;
$rest1 = 60 - $rest;
setcookie("visitor" , "visitor" , time() + $rest1 );
$bolval = 0;
if( sizeof($visitsfile) > 0)
{
$i = sizeof($visitsfile) - 2;
$val = floor( ( intval( substr( $visitsfile[$i] , 0 , - 1) ) / 60 ) ) - floor( ( time() / 60 ) ) ;
if( $val == 0 )
{
$visitsfile[$i+1] = intval( substr( $visitsfile[$i + 1] , 0 , - 1) ) + 1 . "\n";
$bolval = 1;
}
}
if( sizeof($visitsfile) == 0 || !$bolval)
{
if(sizeof($visitsfile) == 0)
{
$i = 0;
}
else
{
$i = sizeof($visitsfile);
}
$visitsfile[$i] = time() . "\n";
$visitsfile[$i+1] = "1\n";
}
$fp = fopen("visits.txt", "w");
if (flock($fp, LOCK_EX))
{
$i = 0;
while($i < sizeof($visitsfile))
{
fwrite($fp, $visitsfile[$i] );
$i++;
}
flock($fp, LOCK_UN);
}
fclose($fp);
}
$n = sizeof($visitsfile);
if(! isset($_COOKIE["visitor"]))
{
echo intval( substr( $visitsfile[$n - 2] , 0 , - 1) ) . " " . (intval( substr( $visitsfile[$n - 1] , 0 , - 1) ) - 1 ) ;
}
else
{
echo intval( substr( $visitsfile[$n - 2] , 0 , - 1) ) . " " . intval( substr( $visitsfile[$n - 1] , 0 , - 1) ) ;
}
?>