php - 使用 PHP 在页面查看计数器中获取异常错误
问题描述
我有fwrite
一个 .txt 文件中的页面视图计数器脚本,我在另一个文件中回显它,我必须在其中显示页面视图。计数器更新脚本是:
$handle = fopen("counter.txt", "r");
if(!$handle){
echo "could not open the file" ;
} else {
$counter = (int ) fread($handle,20);
fclose ($handle);
$counter++;
$handle = fopen("counter.txt", "w" );
fwrite($handle,$counter) ;
fclose ($handle) ;
}
上面的代码fwrite
在文件名中写入 ( ) 页面浏览量counter.txt
而我要显示页面浏览量的页面也是 HTML 和 PHP 的组合。我在那里添加的代码如下,读取视图并显示它
$handle = fopen("counter.txt", "r");
if(!$handle){
echo "could not open the file" ;
} else {
$counter = ( int ) fread ($handle,20) ;
}
echo $counter;
上面的代码显示了页面浏览量。它从counter.txt
文件中读取并显示页面视图。
为此我收到异常错误。当我试图通过它访问文件时,desktop
它显示错误的页面视图。它增加了额外的1
视野。例如,如果只有1
页面视图,它会显示2
但在android
或ios
设备上它工作正常。对于android
或ios
显示正确计数的设备。我想知道代码有问题吗?简而言之,上面的脚本每次都显示 +1(额外的 1 个视图)。(仅适用于笔记本电脑或个人电脑)
解决方案
正如其他人所说,用 PHP 中的简单文件做一个计数器不是一个好主意。网页上有许多您不知道的点击量(例如搜索引擎、已知和未知的蜘蛛、普通访问者……)。这些可能会或可能不会干扰并希望同时访问此文件。这会导致不清楚的情况,这可能会导致奇怪的错误。因此,最重要的提示是使用能够在访问期间锁定数据并使添加数据安全的数据库。
让我们看看你的代码:最大的问题之一是,写你的文件意味着操作系统会清除文件并重写它。在最坏的情况下,这意味着硬盘启动,将自身定位在文件中,尝试打开它,清除它,向其中写入数据并随后关闭它。这将需要很多周期 - 足够的时间被其他尝试访问您的页面的人打断。当然,SSD 的工作速度要快得多,但在数据冲突方面则不然。
如果您不能使用数据库,我们需要尝试“锁定”您的文件以供一次性使用。这是您更新的代码:
$handle = fopen("counter.txt", "r");
if(!$handle){
echo "could not open the file" ;
} else {
$counter = (int ) fread($handle,20);
fclose ($handle);
$counter++;
$handle = fopen("counter.txt", "w" );
if (flock($handle, LOCK_EX | LOCK_NB)) {
fwrite($handle, $counter) ;
flock($handle, LOCK_UN); // open the lock again
}
fclose ($handle) ;
}
这会尝试锁定您的文件。如果它不可锁定,它不会阻止进一步的执行,而是通过 fwrite-line。您可以删除 LOCK_NB 但这意味着您的服务器将等到块被提升,这可能需要一段时间。阻止网络服务器不是一个好主意,所以也许不计算访问者是更好的方法。
第三种-稍微复杂一点 - 方法是在目录中为访问者编写唯一文件,并自动收集投票(例如 cron-job),该投票可以单一访问您的访问者文件。这样你就不会发生碰撞。
快乐编码。
推荐阅读
- python-3.x - “没有名为 torch 的模块”。但是在 Ubuntu 18.04.02 服务器版中安装了带有 conda 的 pytorch 1.3.0
- c++ - 字符串数据类型如何存储为字节
- quantifiers - 受量词约束的元组变量能否出现在“|”的左侧 在元组关系演算中?
- python - 在熊猫列表中查找字符串的一部分
- python - 如何按大小过滤数据框字典?
- matlab - 如何在 MATLAB 中生成 Nakagami-m 衰落通道?
- c# - 使用 Selenium C# 为 IWA 应用程序实现模拟
- node.js - 如何在nodeJS中使用异步处理错误?
- csv - 重组这个 csv 最简单的方法是什么?
- python - 在计算机重新启动之前,编辑器中更新的 HTML 代码不会出现在浏览器中