高层次的想法: 我有一个微控制器,可以通过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';}
?>
这是提高速度和提高可靠性的适当方法和建议
答案 0 :(得分:2)
如果我正确理解您的应用程序,您的客户端就是微控制器。它会在一段时间内向您的php / mysql Web应用程序发出HTTP请求。该请求的频率取决于微控制器,但似乎是一分钟左右。
请求基本上问道,“老兄,我有什么新东西?”
您的网络应用需要发送答案,“不是现在”或“这就是我所拥有的。”
您应用的另一部分是提供相关信息。并且它与您的微控制器异步(即,只要它想要)。
使微控制器查询高效是您目前的目标。
(注意,如果我有任何这些假设错误,请纠正我。)
您的表格需要last_update
列,which_microcontroller
列或同等列,以及notified
列。只是为了笑容,我们还要放入value1
和value2
列。您还没有告诉我们您在表格中保留了哪种数据。
更新表格的软件需要执行此操作:
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
}