gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:28:00 25 4
gpt4 key购买 nike

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

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

更新:

  • 非常感谢 Ollie Jones。我已经实现了他的一些这里有建议。

  • 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 网络应用程序发出 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 是一个唯一的键。如果不是,您仍然可以执行此操作,但会稍微复杂一些。

注意我们在这个例子中没有使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com