查询自上次检查后条目是否已更改并持续检查时间

时间:2013-07-29 17:09:14

标签: php mysql sql mysqli

高层次的想法: 我有一个微控制器,可以通过http请求连接到我的网站...我想在数据库中注明更改后立即向设备提供响应...

由于终端设备是一个客户端,即微控制器...我不知道一种方法将数据传递给客户端而不必设置端口转发...这是非常不希望的...问题出现当尝试从外部网络向内部网络发送数据时... A.端口转发或B让客户端设备发起请求,这使我想到让设备向报告更改的文件发送http请求< / p>

更新

  • 非常感谢Ollie Jones。我对他的一些人表示赞赏 建议在这里。

  • Jason McCreary建议修改一个很大的专栏 改善,因为它应该提高速度和可靠性......太棒了 建议! :)

  • 如果数据库过度工作在本例中有问题 也许以下内容可以在...插入数据时... 数据库将更改写入文件...然后循环
    不断检查该文件的更新....想法?

我有table1并且我想查看自上次检查以来是否更新了特定行(基于UID /密钥)以及如果记录下注更新则连续检查60秒。 ..

我想我可以使用INFORMATION_SCHEMA数据库来做到这一点。

此数据库包含有关表,视图,列等的信息。

尝试解决方案:

    <?php 
$timer = time() + (10);//add 60 seconds
$KEY=$_POST['KEY'];
$done=0;

if(isset($KEY)){
//loign stuff
require_once('Connections/check.php');
$mysqli = mysqli_connect($hostname_check, $username_check, $password_check,$database_check);
if (mysqli_connect_errno($mysqli))
{ echo "Failed to connect to MySQL: " . mysqli_connect_error(); }
//end login


$query = "SELECT data1, data2
FROM station 
WHERE client = $KEY
AND noted = 0;";

$update=" UPDATE station
SET noted=1
WHERE client = $KEY
AND noted = 0;";

while($done==0) {
   $result = mysqli_query($mysqli, $query);
   $update = mysqli_query($mysqli, $update);

   $row_cnt = mysqli_num_rows($result);

   if ($row_cnt > 0) {
      $row = mysqli_fetch_array($result);
      echo  'data1:'.$row['data1'].'/';
      echo  'data2:'.$row['data2'].'/';
      print $row[0];
      $done=1;
   }
   else {
      $current = time();
      if($timer > $current){ $done=0; sleep(1); } //so if I haven't had a result update i want to loop back an check again for 60seconds
   else { $done=1; echo 'done:nochange';}//60seconds pass end loop
}}

mysqli_close($mysqli);
echo 'time:'.time();
}
else {echo 'error:nokey';}
?>

这是提高速度和提高可靠性的适当方法和建议

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的应用程序,您的客户端就是微控制器。它会在一段时间内向您的php / mysql Web应用程序发出HTTP请求。该请求的频率取决于微控制器,但似乎是一分钟左右。

请求基本上问道,“老兄,我有什么新东西?”

您的网络应用需要发送答案,“不是现在”或“这就是我所拥有的。”

您应用的另一部分是提供相关信息。并且它与您的微控制器异步(即,只要它想要)。

使微控制器查询高效是您目前的目标。

(注意,如果我有任何这些假设错误,请纠正我。)

您的表格需要last_update列,which_microcontroller列或同等列,以及notified列。只是为了笑容,我们还要放入value1value2列。您还没有告诉我们您在表格中保留了哪种数据。

更新表格的软件需要执行此操作:

 UPDATE theTable 
   SET notified=0, last_update = now(), 
       value1=?data, 
       value2?=data
 WHERE which_microcontroller = ?microid

它可以根据需要经常这样做。新数据值替换并覆盖旧数据。

处理微控制器请求的软件需要执行以下查询序列:

  START TRANSACTION;

 SELECT value1, value2
   FROM theTable 
  WHERE notified = 0
    AND microcontroller_id = ?microid
    FOR UPDATE;

 UPDATE theTable
    SET notified=1
  WHERE microcontroller_id = ?microid;

 COMMIT;

这将从数据库中检索最新的value1和value2项(您的应用程序的数据,无论它是什么),如果它自上次查询后已更新。处理微控制器请求的php程序可以使用该数据进行响应。

如果SELECT语句没有返回任何行,那么你的php代码会以“无变化”的方式响应微控制器。

这一切都假设microc_id是一个唯一的密钥。如果不是,你仍然可以这样做,但它有点复杂。

注意我们在这个例子中没有使用last_update。我们刚刚使用了通知标志。

如果您想等到上次更新后的60秒,则可以这样做。也就是说,如果你想等到value1和value2停止改变,你可以这样做。

  START TRANSACTION;

 SELECT value1, value2
   FROM theTable 
  WHERE notified = 0
    AND last_update <= NOW() - INTERVAL 60 SECOND
    AND microcontroller_id = ?microid
    FOR UPDATE;

 UPDATE theTable
    SET notified=1
  WHERE microcontroller_id = ?microid;

 COMMIT;

要使这些查询有效,您需要以下索引:

  (microcontroller_id, notified, last_update)

在此设计中,您无需让PHP代码循环轮询数据库。而是在微控制器检入更新/

时查询数据库

答案 1 :(得分:0)

如果所有table1更改由PHP 处理,则没有理由轮询数据库。在更新table1时,在PHP级别添加所需的逻辑。

例如(假设OOP):

public function update() {
  if ($row->modified > (time() - 60)) {
    // perform code for modified in last 60 seconds
  }

  // run mysql queries
}