2012-01-05 52 views
3

我有一个奇怪的问题,我不知道如何标题的话。实时统计/通过时间戳的增量器

我想要做的事:

我想跟踪的运行总计,我想这个运行总计更新活到我的网页每一秒。我并没有试图跟踪访客,它会跟踪一些奇怪的事情,比如“现在你的身体里有多少血细胞!”这里是一个做我想做的网站,但他们在jQuery中做,我试图在JS中做到这一点,以尽量减少JS文件。 http://www.usagain.com/(左侧)

如何我这样做:

我有AJAX JS文件链接到一个PHP文件和PHP文件打开一个文本文件 - >抓住一个数字 - >增加1 - >将所述数字发送回JS - >将数字更新为HTML - >并且PHP更新文本文件 - >关闭txt文件。

我的问题:

计数器的作品,它增加但问题是,如果我有2个浏览器运行在同一个页面。如果我有3个浏览器的数量将增加2;该数字将增加3,依此类推。我认为这与写入文件有关,但我不知道如何解决它。

我的代码

HTML/CSS/JavaScript的/ AJAX

<html> 
<head> 
<title>Counter</title> 
<script language="javascript" src="../jquery1.6.js"></script> 
<script type="text/javascript"> 

    function addCommas(nStr) //http://www.mredkj.com/javascript/nfbasic.html -- Source 
    { 
     nStr += ''; 
     x = nStr.split('.'); 
     x1 = x[0]; 
     x2 = x.length > 1 ? '.' + x[1] : ''; 
     var rgx = /(\d+)(\d{3})/; 
     while (rgx.test(x1)) { 
      x1 = x1.replace(rgx, '$1' + ',' + '$2'); 
     } 
     return x1 + x2; 
    } 

    function getNum() 
    { 
     $.post('test.php', function(data){ 
      $('#counter').html(addCommas(data)); 
     }) 
    } 
    setTimeOut(getNum, 1000); 
</script> 
<style type="text/css"> 
    #counterContainer{color: #52504D;font-family:Verdana, Geneva, sans-serif;font-weight:bold;font-size:15px;position:relative;top:22px;} 
    #counter{color: #1E7EC8; font-size: 25px;letter-spacing:1px;} 
</style> 
</head> 
<body onload="getNum()"> 
    <div id="counterContainer"> 
     <div id="counter"><!--Counter Goes Here, Do Not Disturb--></div> 
    </div> 
</body> 
</html> 

PHP文件

<?php 
    $fp = fopen("staticNum.txt", "r+"); 
    flock($fp, LOCK_EX); 
    $num = fgets($fp, 11); 
    $num = intval($num)+1; 

    echo $num; 

    fseek($fp, 0, SEEK_SET); 
    fputs($fp, "$num"); 
    flock($fp, LOCK_UN); 
    fclose($fp); 
?> 

我的文本文件只是有这个数吧:

10000100260

任何建议将是伟大的。我的第一个想法是一个数据库,但后来我认为我会有同样的问题。我确实想远离会话变量和Cookie,不过肯定是因为我不认为它们是必需的。但我可能是错的。

奖励积分,如果你能想出一种方法来解决我的问题没有数据库! (不是真的,虽然我不是一个管理员:(

+1

+1很好的布局说明 – amelvin 2012-01-05 22:10:22

+0

如果你要保持一个运行总计的,是游客(如果不忽略其他,只是让我知道你在跟踪什么!),毫无疑问最好使用会话。否则,页面更改或刷新将导致访客数量虚增。 – SmokeyPHP 2012-01-05 22:34:52

+0

我没有跟踪访问者:(这就是我所有的谷歌搜索我会编辑我的问题指定。再次检查“我在做什么”在2秒内。**我真的需要一个更好的标题:/ ** – 2012-01-05 22:39:14

回答

1

相反计数的,尽量与时间戳:

value = (timestamp % ((max_limit - min_limit)/1.5)) * 1.5 + min_limit 
+0

你先生太棒了!唯一的问题是,我必须玩弄数字来找到一个确切的数字。 – 2012-01-09 14:53:26

+0

要在您需要的号码开始,添加改性剂时间戳:值=((时间戳+修正值)%((max_limit - min_limit)/ 1.5))* 1.5 + min_limit – Uboonto 2012-01-14 13:11:55

+0

我尝试添加改性剂,但它并没有区别。最难的部分是计算一个好的'$ min'和'$ max',以便它从一定数量开始。时间戳很难:( – 2012-01-16 16:23:34

1

我不能完全确定你的计数器是如何工作 - 在那里它是从等计数,但我认为这应该可以帮助您:

var init_count = 10000100260; //starting heartbeats 
var count_start = 1325803921; //timestamp of when initial count was taken 

function update_count() 
{ 
    var utstamp = new Date(); 
    utstamp = Math.round(utstamp.getTime()/1000); //get current unix timestamp 
    var newcount = (utstamp - count_start) + init_count; //add seconds passed since initial count, to the initial count 
    $("#beat_count").html(newcount); //set the contents of your element to the new number 
} 

var ticker = setInterval(update_count,1000); //call the above function every 1000 milliseconds (1 second) 

你可以通过使用这里的形式让你的初始时间戳:http://www.functions-online.com/mktime.html

比答案这可能引发更多的问题,但让我知道无论哪种方式

+0

感谢您的帮助。Javascript的问题是我必须跟踪数字。唯一的时间它应该重置为1,000,000,000,当它达到9,999,999,999时,它将从我在txt文件中设置的数字中获得它的初始数字,PHP将文本文件的内容拉到第10个字节,c在PHP第4行反转为int并加1.然后覆盖文本文件。我正在考虑一个JavaScript“计数到这个日期”脚本,但这些脚本通常很长。我将不得不稍后再玩。不过谢谢你! – 2012-01-05 23:11:04

0

计数器的作品,它增加但问题如果我有2个浏览器运行相同的页面,数字将增加2.如果我有3个浏览器;该数字将增加3,依此类推。我认为这与写入文件有关,但我不知道如何解决它。

我假设你有每个用户运行多个浏览器。计数器工作正常,但您认为用户实际上是浏览器。由于每个浏览器都会触发计数的增加,因此您所描述的并不是问题,而只是脚本的工作原理。

+0

对。用户和浏览器在这种情况下是相同的,因为事件在加载时以及其后每秒都会自动触发。问题是我如何修改我的脚本,以便它不这样做。 – 2012-01-06 14:41:47