我正在编写一个使用jQuery的异步来调用php脚本的网站。为了避免双重脚本调用,我想做两件事:
- 禁用将触发脚本调用的按钮,我已经成功完成了
- 在调用的 PHP 脚本中设置一个计时器,该计时器将检查它是否在不到一秒前被同一用户调用,如果是,则退出
首先,我认为这相对容易,并想出了以下代码:
if(!isset($_SESSION['time'])) $_SESSION['time']=time();
else if(time()-$_SESSION['time']<=1){
//If less than one second ago, timer reset
$_SESSION['time']=time();
exit;
}
它第一次工作正常,但之后,当它应该再次检查时,当然一个非常旧的时间已经保存在会话中并且仍然存在,因此可以根据用户的意愿随时调用脚本。
你有什么想法如何解决这个问题吗?谢谢!
查尔斯
编辑
我的问题可能是重复的 - 你看到第二个答案有什么价值吗?
找到的解决方案
这是解决方案:
if(!isset($_SESSION['time']) || ($_SESSION['time'] + 1 < time())){
$_SESSION['time'] = time();
}else if(time()-$_SESSION['time']<=1){
//Timer reset
$_SESSION['time']=time();
exit;
}
最简单的解决方法是覆盖时间值(如果已设置但早于 X 秒):
if(!isset($_SESSION['time']) || ($_SESSION['time'] + 30 < time())) {
$_SESSION['time'] = time();
}
将 30 值更改为所需的超时。
我可能会稍微以不同的方式解决问题,并中止任何不再有效的 AJAX 调用。
例如,假设您的用户以某种方式单击了两次按钮,那么第二次单击可以简单地中止第一次单击的 ajax 请求。
在客户端处理问题将有助于降低服务器上的开销,同时使客户端清理用户正在制作的任何松散部分。
另一个问题应该有助于更精细的细节。