高层理念: 我有一个微 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
列。为了笑一下,我们还添加 value1
和 value2
列。您还没有告诉我们您在表中保存了什么样的数据。
更新表格的软件需要执行以下操作:
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/