我遇到了这个奇怪的问题,无法弄明白。
在某些网站上,我有这个脚本完美...相同的代码,相同的服务器设置......
使用php,有一个简单的页面视图点击计数器,它在本地存储在一个txt文件中。
然后我回应了我网站页脚版权区域的价值,为客户提供了快速的统计数据......它的增长速度非常快。
无论如何..我有一个客户角落烧烤。 com(seo目的我添加了空格)
在那个网站上......多年来一直很好用。
现在又有一个网站和更多...例如... savianos。 COM
这会中断..并且文本值为空。
这是counter.php代码
<?php
session_start();
$counter_name = "counter/hits.txt";
//Check if a text file exists. If not create one and initialize it to zero.
if (!file_exists($counter_name)) {
$f = fopen($counter_name, "w");
fwrite($f,"0");
fclose($f);
}
// Read the current value of our counter file
$f = fopen($counter_name,"r");
$counterVal = fread($f, filesize($counter_name));
fclose($f);
// Has visitor been counted in this session?
// If not, increase counter value by one
if(!isset($_SESSION['hasVisited'])){
$_SESSION['hasVisited']="yes";
$counterVal++;
$f = fopen($counter_name, "w");
fwrite($f, $counterVal);
fclose($f);
}
?>
现在,如果我在txt文件中添加一个值...就像1040 ......然后去网站开始工作......那么一周左右后我再检查它......它的空白了。
有什么想法吗?
我在想这可能会发生这种情况,因为网站可能会在周五晚上的晚餐时间获得TON视图..并且简单的脚本无法处理它...而它试图写一个添加的数字它只是打破并且变成空白......并且永远不会重新开始。
结构就是这样。
/ counter /文件夹有 counter.php和hits.txt文件
网站的每一页都是第一件事
<?php include ('counter/counter.php'); ?>
并且在我们网站的页脚中
<?php echo $counterVal; ?>
答案 0 :(得分:1)
您的代码看起来很完美,但让我们了解情况。您有一个可以同时访问许多用户的文件,因为页面访问可以由多个用户同时完成。当有人修改它时,你不得不锁定另一个用户的文件操作,对吗?请看看
答案 1 :(得分:0)
很可能是因为你有两个并发脚本试图在一个文件中打开文件而其中一个失败。当有多个脚本实例可以同时运行时,您必须使用flock()。如果你要使用文件读写,计数器是最重的东西。我编写了这个包装器来轻松实现文件锁定。
如果您想查看我在运行中的一个计数器,请尝试http://ozlu.org。那个动态的计数器图像是自建的。 fileReadAll将一次性读取整个文件。文件编写器只有两种模式,写或附加。您可以将fileWriter传递给数组或字符串,然后将其写入文件。该函数不会添加任何\ n来格式化您的文本,因此您必须添加它。如果未设置第三个参数,则fileWriteAll的默认模式为w。
function fileWriteAll($file, $content, $mode = "w"){
$mode = $mode === "w" || $mode === "a"? $mode : "w";
$FILE = fopen($file, $mode);
while (!flock($FILE, LOCK_EX)) { usleep(1); }
if( is_array($content) ){
for ($i = 0; $i < count($content); $i++){
fwrite($FILE, $content[$i]);
}
} else {
fwrite($FILE, $content);
}
flock($FILE, LOCK_UN);
fclose($FILE);
}
function fileReadAll($file){
$FILE = fopen($file, 'r');
while (!flock($FILE, LOCK_SH)) { usleep(1); }
$content = fread($FILE, filesize($file));
flock($FILE, LOCK_UN);
fclose($FILE);
return $content;
}