方案分享:防止数据写入失败新方案

王志勇 发表于 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个多小时,圆满完成。

0条评论:

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

直接发送Trackback到此文章

说明:本评论系统不支持HTML代码。(您的留言需要审核,审核规则请见这里。)

王志勇:程序设计者。
1980-09-26 (38周岁)

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

Blog存档 Archives

2018年10月
2018年09月(17)
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2018 auiou.com All rights reserved.
此Blog程序由王志勇编写 已经发布在Arsue