0

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

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

问题是,在浏览器获取 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) ) ;
  }


?>
4

0 回答 0