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