查询一段时间?

时间:2014-01-05 01:42:43

标签: php mysql

有没有办法从PHP脚本查询设定时间?

我想编写一个带有id的PHP脚本,然后查询MySQL数据库以查看是否匹配。如果另一个用户可能尚未上传他们的匹配,那么我的目标是查询,直到找到匹配或直到5秒过去,然后我将返回0。

在伪代码中,这就是我的想法,但它似乎不是一个好方法,因为我读过循环查询并不是一个好习惯。

$id_in = 123;
time_c = time();
time_stop = time + 5; //seconds

while(time_c < time_stop){
     time_c = time()
     $result = mysql_query('SELECT * WHERE id=$id_in');
}

2 个答案:

答案 0 :(得分:1)

听起来您的要求是轮询某个表,直到显示具有特定ID的行为止。你需要这样的查询才能做到这一点:

SELECT some-column, another column FROM some-table WHERE id=$id_in

(专业提示:请勿在软件中使用SELECT *。)

您似乎想要轮询五秒然后放弃。让我们来解决这个问题。

一种选择是简单sleep(5),然后使用您的查询轮询表格。这样做的好处是非常简单。

另一种选择就是你拥有的。这将使你的php程序尽可能快地敲击桌子,一遍又一遍,直到轮询成功或直到你的五秒钟用完为止。这种方法的优点是当其他程序到达表时,你的php程序不会睡着。换句话说,它将以最小的延迟来获取对表的更改。然而,这种选择具有巨大的缺点。通过尽可能快地敲击桌子,你将占用MySQL服务器上的资源。这通常是浪费的。它会阻止你的应用程序有效扩展(如果你有一万个用户都这样做会怎么样?)具体来说,它可能会减慢试图击中表的其他程序,因此无法在五秒钟内完成更新。

然而,有中间立场。尝试做半秒钟等待

 usleep(500000);

每次轮询表格之前。这不会浪费MySQL资源。即使你的php程序在其他程序到达桌面时处于睡眠状态,它也不会长时间睡着。

答案 1 :(得分:0)

无需进行简单的轮询和休眠。我不知道您的确切要求,但一般来说,您的问题要求GET_LOCK()PHP's Semaphore support

假设您的上传过程以

开头
SELECT GET_LOCK("id-123", 0);

您的查询线程可以等待该锁定:

SELECT GET_LOCK("id-123", 5) as locked, entities.*
  FROM entities WHERE id = 123;

您最终可能会发现TRIGGER就是您要找的东西。