【问题标题】:PHP/AJAX: Is it sleep() that blocks all requests to the same script?PHP/AJAX:是 sleep() 阻止对同一脚本的所有请求吗?
【发布时间】:2013-06-21 16:09:35
【问题描述】:

我有一个 PHP 脚本,当它被调用时,它会做一些事情,然后休眠 3 秒,然后回显它的结果。

然后我有这个页面,它每隔1/10 秒调用一次上面的脚本(带有 Ajax 请求)。当我收到响应时,我会在 div 元素中写入一个数字。

问题是,onreadystatechange 处理程序每​​ 3 秒触发一次,总共写入 30 个数字。 sleep() 的其他替代品是否符合我的需要?

这里是被请求页面的代码sn-p:

ignore_user_abort(true);
$time=microtime(true)*10000;
changemystatus(1, $time); //this writes to a database
sleep(3);
if ($time>=getmytime()){ //getmytime() reads the data previously written by changemystatus()
    setstatus(0); // still writing to that DB
    echo("1");
}else echo ("0");

基本上,如果用户不再发送请求(因为他走了,或者他的连接中断,或者他禁用了 JS 或其他什么),我希望数据库中的“状态”字段更改为 0,以便其他玩家可能知道他现在“离线”了。

【问题讨论】:

  • 服务器应该是Apache。
  • 您是否正在尝试获取 PHP 脚本的进度?你为什么要这样做?
  • 问题不够精确,您将不得不指定更多细节。请张贴代码。
  • 因为在我睡了 3 秒后,我检查是否同时再次调用了脚本:如果没有,则用户已断开连接。 (我还添加了 ignore_user_abort(true) )
  • 不,我想确保用户处于活动状态并连接到该页面。它是回合制浏览器游戏的一部分

标签: php ajax sleep


【解决方案1】:

新答案:如果您想检测用户是否仍处于活动状态,请记录他们上次与服务器通信的时间戳。

然后定义一些截止点,比如:5 分钟。

if ($last_active < (time() - 5 * 60)) {
    // user is inactive
}

【讨论】:

  • 有些东西必须调用它。而且不能是 JS,因为我可以禁用它然后退出 bage,让它看起来像我仍然在线。
  • 服务器保留$last_active时间戳。如果客户端什么都不做(即不发送请求)$last_active 最终将低于 5 分钟前,并且您的不活动检测。
  • 我不认为你明白我的意思。我的意思是,这段代码 sn-p 必须在某个时间点、某个地方、某个人调用。在哪里?简而言之,我在哪里复制粘贴?
  • 否则你会在哪里检查$status === 0
  • 好吧,我会使用查询“WHERE status = 1”。我明白了……它可以工作。尽管如此,我还是想弄清楚我的代码到底出了什么问题。
【解决方案2】:

您可以在 JavaScript 中使用setTimeout'sleep'

例如:

setTimeout(function () {
    console.log("3 seconds have passed");
}, 3000);

这不会阻止 JavaScript 或浏览器,因为 setTimeout 是异步的。它将安排一个事件在 3 秒(3000 毫秒)后触发,以执行该函数。

【讨论】:

  • 但是用户可以用油脂猴之类的东西来改变它,不是吗?
  • 用户可以根据需要向您的服务发送垃圾邮件,在一秒钟内调用它 100 次。 sleep 不会采取任何措施来防止这种滥用行为。如果您确实想防止滥用,则需要做更多的事情。
  • 嗯,没关系,我希望它在一秒钟内被调用尽可能多的次数。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2021-11-14
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多