使用PHP和jQuery进行长轮询 - 更新和删除问题

时间:2014-04-02 08:25:44

标签: php jquery mysql

我写了一个小脚本,它使用了长轮询的概念。

它的工作原理如下:

  • jQuery将一些参数(比如lastId)发送给php
  • PHP从数据库中获取最新的id并与lastId进行比较。
  • 如果lastId小于新获取的Id,则它会终止 脚本并回显记录。
  • 从jQuery中,我显示此输出。

我已经处理了所有安全检查。问题是当记录被删除或更新时,无法知道这一点。

我能得到的最近的解决方案是计算行数并将其与一些保存的行计数变量匹配。但是,如果我有1000条记录,我必须回应所有1000条记录,这可能是一个很大的性能问题。

此应用程序的CRUD功能完全分离,并在不同的服务器中运行。所以我不知道哪条记录被删除了。

我不需要任何编码帮助,但我正在寻找一些建议,以便在更新和删除时使其工作。

请注意,websockets(my fav)和node.js对我来说不是一个选项。

2 个答案:

答案 0 :(得分:1)

您可以检查表格本身何时被修改,而不是使用表格中的某个ID。

SQL:

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'yourdb'
    AND TABLE_NAME = 'yourtable';

如果成功,该语句应返回类似

的内容
UPDATE_TIME
2014-04-02 11:12:15

然后使用生成的时间戳而不是lastid。我正在使用一种非常类似的技术来显示和自动刷新日志,就像一个魅力。

您必须根据需要调整语句,并将yourdbyourtable替换为您的应用程序所需的值。它还要求您有权访问information_schema.tables,因此请检查这是否可用。

两种替代解决方案:

  • 如果上述解决方案对于您的目的来说太不精确(当表每秒更改多次时可能会导致问题),您可以将该时间戳与当前机制lastid结合使用以覆盖新插入
  • 另一种方法是实现一个表,其中记录当前状态。这是您的ajax请求检查当前状态的位置。然后在数据表中生成triggers,更新此表。

答案 1 :(得分:0)

您可以通过

获得最高ID
SELECT id FROM table ORDER BY id DESC LIMIT 1

但是我认为这不可靠,因为你可以拥有1,2,3,7的ID,并且你插入一个ID为5的新行。

请注意:最高ID,不一定是最近的行。

当前的自动增量值可以通过

获得
SELECT AUTO_INCREMENT FROM information_schema.tables
WHERE  TABLE_SCHEMA = 'yourdb'
AND TABLE_NAME = 'yourtable';

也许时间戳+ microtime是你的选择吗?