3

我需要编写一个应用程序,每 10 秒检查一次来自外部服务器的数据库,以查看是否有新数据。目前,我有一个 javascript,它通过比较两个 JSON(旧 JSON 和从服务器获取的新 JSON)以及它是否提醒用户来检查数据是否已更改服务器。但这不是我在这个应用程序中需要的。仅当数据是新的而不是更改时才应提醒用户。

我在想也许我可以用一个查询 MYSQL 的 PHP 代码来做到这一点,如果查询 num_results 是 0 循环,直到用户收到通知时 num_results 大于 0。在这个应用程序中,新数据是在 0.1 秒还是 10 秒内可供用户使用并不重要,只要用户得到它。这就是我尝试进行 MYSQL 检查的方式,但它不起作用:

<?php
include 'config.php';

if(isset($_GET['ID'])) {
    $maxLoop = 20;    
    while($maxLoop--) {
        $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        try {
            $sth = $dbh->prepare('select * from testit where id = :id');
            $sth->bindParam(':id',$_GET['ID'],PDO::PARAM_INT);
            $sth->execute();
            if($sth->rowCount()>0) {
                $results = $sth->fetchAll(PDO::FETCH_OBJ);
                echo '{"key":'. json_encode($results) .'}';
                exit; // Found new data, end loop and script
            }
        } catch(PDOException $e) {
            break;   
        }
        sleep(3);    
    } // end while
} // end if

那么如何更改此代码以使其工作,或者我应该尝试编写一些可以做到这一点的javascript?如果是这样,我如何检查数据是否是新的,而不是仅仅检查它是否已更改?

4

2 回答 2

3

您如何记录“新”数据?有时间戳吗?auto_increment 主键字段?

最简单的轮询方法是简单地跟踪最后一个已知的 id/时间戳,看看是否有任何具有更高 id/更新时间戳的东西。

照原样,您的方法效率很低。您选择表中的所有记录,强制 mysql/pdo 开始从磁盘等获取该数据......然后在获得行数后将其丢弃。一种更有效的方法是对 a 执行select count(*) ...并检查该值。这使 mysql 不必开始从磁盘获取实际的行数据。在某些表类型(尤其是 myisam)上,count(*) 操作非常快。

于 2012-04-18T05:03:51.833 回答
1

如果您希望您的应用程序每 10 秒检查一次更改,则必须使用AJAX向服务器上的 php 文件发出asyncronous请求。在 php 文件中,您只需要这样做,select * from testit where condition=false您将获得“新数据”。这是一个链接,您可以从中学习基础知识AJAXhttp ://www.w3schools.com/ajax/default.asp

于 2012-04-18T07:09:16.673 回答