php - 查询自上次检查以来条目是否已更改并连续检查一段时间

标签 php mysql sql mysqli

高层理念: 我有一个微 Controller ,可以通过 http 请求连接到我的站点...我想在数据库中注意到更改后立即向设备提供响应...

由于终端设备是客户端,即微 Controller ...我不知道无需设置端口转发即可将数据传递给客户端的方法...这是非常不希望的...出现问题当尝试从外部网络向内部网络发送数据时...A.端口转发或B让客户端设备发起请求,这使我想到让设备向文件发送http请求以轮询更改

更新:

  • 非常感谢奥利·琼斯。我已经实现了他的一些 这里有建议。

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

  • 本例中是否存在数据库过度工作的问题
    也许下面的方法可以工作......当数据插入到 数据库将更改写入文件...然后循环
    不断检查该文件是否有更新......想法?

我有table1,我想查看自上次检查以来特定行(基于 UID/键)是否已更新,并连续检查 60 秒是否有记录投注已更新...

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

该数据库包含有关表、 View 、列等的信息。

尝试解决方案:

    <?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';}
?>

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

最佳答案

如果我正确理解您的应用程序,您的客户端是一个微 Controller 。它偶尔会向您的 php/mysql Web 应用程序发出 HTTP 请求。该请求的频率取决于微 Controller ,但似乎是每分钟一次左右。

该请求基本上是在问:“伙计,有什么新东西给我吗?”

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

应用程序的另一部分是提供相关信息。而且它与您的微 Controller 异步执行此操作(即,只要它愿意)。

让微 Controller 查询高效是您当前的目标。

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

您的表将需要一个 last_update 列、一个 which_microcontroller 列或同等列,以及一个 notified 列。为了笑一下,我们还添加 value1value2 列。您还没有告诉我们您在表中保存了什么样的数据。

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

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

它可以根据需要经常执行此操作。新的数据值替换并覆盖旧的数据值。

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

  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 项(您的应用程序的数据,无论它是什么)(如果自上次查询以来已更新)。处理来自微 Controller 的请求的 php 程序可以使用该数据进行响应。

如果 SELECT 语句未返回任何行,则您的 php 代码会以“无更改”的方式响应微 Controller 。

这一切都假设 microcontroller_id 是唯一的 key 。如果不是,您仍然可以执行此操作,但会稍微复杂一些。

请注意,在此示例中我们没有使用last_update。我们刚刚使用了通知标志。

如果您想等到上次更新后六十秒,可以这样做。也就是说,如果您想等到 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 代码循环轮询数据库。相反,当您的微 Controller 检查更新时,您会查询数据库/

关于php - 查询自上次检查以来条目是否已更改并连续检查一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930036/

相关文章:

mysql - 使用 SQL 连接 3 个以上的表显示太多结果

php - 使用 curl 在现场发布数据以进行 Expedia 预订

php - 如何从 PHP session 数组中删除变量

php - 如果用户的积分超过 10,000,他们会获得 5 级,但他们会获得 1 级? mysql逻辑错误?

php - 如何使用 php 更新数组值并将其放入 mysql 数据库中?

php - 按日期从 MySQL 中的另一行中减去行

java - 如何修复 java.sql.SQLException。没有适合 jdbc 的驱动程序

mysql - 如何使用mysql从存储过程中删除重复项

php - 多个表上的 SQL 查询

php - 替换 CSV 中的换行符