王志勇 发表于 2018年10月10日 09:01
计数器在以前很多年里不使用,不统计网站的访问量,是因为计数器会消耗一点服务器资源,因为每访问一次就要对硬盘进行一次数据写入。
大概在2010年,webshu的网站从原来的HTML全静态+ASP动态页,重构为PHP全动态。我当时新写了一个计数器的程序,但是发现总访问量达到3万、或5万的时候,又会自动清零,重新统计,这样的情况在这几年里出现了6-8次以上。这是怎么回事呢?由于数据写入失败造成的。
特别是像计数器这种由用户访问、自动写入数据的情况,需要采取防止数据写入失败的措施。这个方案是,假设将要写入的新数据是$a1,原有的写入数据程序,更改为执行5次循环,其中第1次循环只执行写入,从第2次循环开始读取新写入的数据$a1,其中变量$a2是第2次循环开始读取的数据,让$a1和$a2进行比对,如果$a1和$a2的值相同,则说明写入成功,此时用break;语句来终止循环,这样实际相当于只循环了1次,也就是循环到1时先写入,循环到2时进行比对、并终止循环。
如果$a1和$a2的值不相同,就是如上述的计数器到3万、或5万的时候,出现的数据写入失败,这时会继续往后循环到3,继续写入、再继续自动比对,一旦写入成功,则自动终止循环。
自动终止循环在此处有2个重要意义,1是一旦写入成功,则不再写入,后面再重复执行写入就没有意义(甚至可能重复的写入会写入错误的数据),2是减少硬盘的写入。
通用程序思路如下:
<?
// ……前面程序个例省略,$a1为将要写入的数据值
$a2='';
for ($i=1;$i<=5;$i++){if ($i>1) …… //读取$a2的语句
if ($a2==$a1) break;
if ($a2!=$a1){ …… //写入$a1的语句
}}
?>
其中if ($i>1)这个条件,巧妙地让第1次循环不读取$a2,因为第1次循环时$a1还没有写入。
这个方案昨天调试了2个多小时,圆满完成。
置顶的文章:
股骨头坏死的中早期修复方法
Windows流畅度300%以上体感的操作
超低价享受i7-7700的体验
家用电脑理性优化升级天梯图之2026
服务器版Linux系统的选择之2026
秒会+实战PHP程序设计培训(2)
如何快速自制CPU天梯图?
我不明白你明不明白我明白(明白不)
近期的主题:
“更新提示”的好处/提醒用语
PHP和Java、CGI、Python的区别
前几天差点进入生活黑洞
为什么不要定义Web 3.0?
歌名含义最好的一首中文歌
实验测试结果
这一次的程序设计速度和防攻思路
关于是否撤文章的问题
程序的及时作用
数码评测(76):万元的折叠屏手机
数码评测(75):DDR 3/4/5的性能测试
健康维护(3):为什么股骨头坏死中期可能能治疗?
博客近期大调整已经初步完成
本机安装PHP 8
健康维护(2):股骨头坏死有多接近?
北京之行2026
健康维护(1):为什么晚上睡觉时会肚子疼?
https利弊(5):技术上的定向安全与垄断本质
博客正在加紧调整中
十分感谢博友点评:自由勇 二十年博客的老程序员
版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。
与此相关的链接
自由勇专栏
Blog存档 Archives
2025年-2026年03月(10)
2024年(13)
2023年 +