PHP睡眠准确性

时间:2011-01-08 23:33:05

标签: php time

我使用以下代码查看用户在特定页面上的时长。我在这个脚本中使用了带有src属性的隐藏图像:

$timer_seconds = 1;

while(!connection_aborted()) { 
   echo "\n";
   flush();
   sleep(1);
   $timer_seconds++;
}

我有时会发现这可能会在5-10秒后关闭!我猜它影响时间的服务器负载??

无论如何我能准确吗?

感谢大家的帮助。

6 个答案:

答案 0 :(得分:5)

您应该使用Javascript执行此操作。 例如,在客户端(使用Ajax或图像请求)请求文档的卸载事件。

答案 1 :(得分:4)

echoflush可能需要一些时间,因此您的循环会停留1秒+在echoflush上花费的时间。尝试类似:

$begin_time = time();
$elapsed_time = 0;

while(!connection_aborted()) {
  echo "\n";
  flush();
  sleep(1);
  $elapsed_time = time() - $begin_time;
}

答案 2 :(得分:2)

使用jQuery,您可以进行同步ajax调用onbeforeunload(我知道它不再是完全 ajax),以告知用户在页面上的时长。

事情的真相是它确实没有告诉你什么。仅仅因为有人在页面上并不意味着他们正在查看页面。仅仅因为他们非常简短地查看页面,并不意味着他们也不喜欢它。

答案 3 :(得分:1)

你有一些很好的工具(在javascript中)来做到这一点。

http://chartbeat.com

http://analytics.google.com

这些是我工作的公司中使用的一些。

答案 4 :(得分:0)

没有可靠的方法从服务器执行此操作。

答案 5 :(得分:0)

正如@erjiang所说,echo和flush花费时间,之后你就让脚本进入睡眠状态......所以如果需要刷新1秒钟然后你睡1秒就需要2秒,你只需加一个!

解决方案是写一个开始和结束时间,然后找出差异:

$start = time();

while(!connection_aborted()){ 
  echo "\n"; //probably not needed...
  flush(); //same probably not needed :)
  sleep(1); //so just a sleep to not continue the code
}

$end = time();
$diff = $end - $start;
$days=floor($diff/86400);
$hours=floor(($diff-($days*86400))/3600);
$minutes=floor(($diff-(($days*86400)+($hours*3600)))/60);
$secconds=floor(($diff-((($days*86400)+($hours*3600))+($minutes*60))));

echo "\n\n".$hours."/".$minutes."/".$secconds;

会做到的! ;)