我使用以下代码查看用户在特定页面上的时长。我在这个脚本中使用了带有src属性的隐藏图像:
$timer_seconds = 1;
while(!connection_aborted()) {
echo "\n";
flush();
sleep(1);
$timer_seconds++;
}
我有时会发现这可能会在5-10秒后关闭!我猜它影响时间的服务器负载??
无论如何我能准确吗?
感谢大家的帮助。
答案 0 :(得分:5)
您应该使用Javascript执行此操作。 例如,在客户端(使用Ajax或图像请求)请求文档的卸载事件。
答案 1 :(得分:4)
echo
和flush
可能需要一些时间,因此您的循环会停留1秒+在echo
和flush
上花费的时间。尝试类似:
$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)
答案 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;
会做到的! ;)