php每日计数器多访问错误

php每日计数器多访问错误,php,web,parallel-processing,Php,Web,Parallel Processing,我正在用PHP编写一个网页每日点击计数器,只是为了进行实验 同一天内从同一浏览器进行的多次访问应计为1, 为了做到这一点,我正在使用饼干 问题是,在浏览器获取cookie之前,脚本可以并行执行多次,而没有任何线程找到cookie,因此计数器无法按预期工作 那么,如何避免脚本并行执行以服务来自同一浏览器的请求呢 谢谢 下面是一个例子: 请注意,为了简化调试,现在一天的时间为1分钟:D, 计数器是左边第二个值。 代码如下: (有人能帮我让它看起来可读吗?):D 我不确定这是否可以在不引起其他问题

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

同一天内从同一浏览器进行的多次访问应计为1, 为了做到这一点,我正在使用饼干

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

那么,如何避免脚本并行执行以服务来自同一浏览器的请求呢

谢谢

下面是一个例子: 请注意,为了简化调试,现在一天的时间为1分钟:D,
计数器是左边第二个值。

代码如下: (有人能帮我让它看起来可读吗?):D



我不确定这是否可以在不引起其他问题的情况下解决。但如果你想让别人帮你修复代码,你应该发布代码。对于大多数网站来说,点击计数器的精确性并不重要。所以他们不担心像这样的角落案件,就像他们不担心那些清理他们藏匿处的人一样。您的页面可能经常被并行访问吗?使用
{}
工具标记代码使用cookie的全部原因是为了检测来自同一浏览器的请求,不是吗?在设置cookie之前,服务器无法判断两个连接来自同一个浏览器。如果有的话,你就不需要cookie了。你能做的就是跟踪那些没有cookie连接的IP。如果您看到相同的IP没有cookie,请将其视为重复。IP并不是唯一定义浏览器的(因为代理和NAT),但同一IP后面的两个浏览器不太可能如此紧密地结合在一起。
<?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) ) ;
  }


?>