php每日计数器多次访问bug

时间:2013-06-21 15:27:07

标签: php web parallel-processing

我正在编写,只是为了试验,使用PHP进行网页每日点击计数器。

同一天内来自同一浏览器的多次访问应计为1, 为了做到这一点,我正在使用cookies。

问题是,在浏览器获取cookie之前,脚本可以多次并行执行,而没有任何线程找到cookie,因此计数器不能按预期工作。

那么如何避免脚本并行执行以提供来自同一浏览器的请求?

感谢。

以下是示例: 请注意,为了使调试更容易,这一天现在是1分钟长:D,
计数器是左起第二个值 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) ) ;
  }


?>

0 个答案:

没有答案