2013-07-29 30 views
2

高級別理念: 我有一個微控制器,它可以通過一個HTTP請求連接到我的網站...我想喂設備只要改變在數據庫上指出的響應...查詢,如果自上次檢查一個條目已經改變,不斷檢查時間

由於終端裝置是微即控制器客戶機...林不知道來傳遞數據到客戶端,而無需設置的方法的up端口轉發......這是非常不希望的......當從外部網絡發送數據到內部網絡時出現問題...... A.端口轉發或B使客戶端設備發起請求,讓設備發送一個http請求到文件輪詢的想法更改

更新

  • 許多感謝奧利·瓊斯。我已經在這裏建議他的一些 建議。

  • 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

什麼是「連續檢查」是什麼意思? 「看一次,然後繼續用重複檢查來錘擊數據庫」? –

+0

@MarcB是的。這就是我的意思...睡覺(2);不能傷害我猜 –

回答

2

如果我正確理解您的應用程序,你的客戶是一個微控制器。它偶爾發送一個HTTP請求到你的php/mysql網絡應用程序。該請求的頻率取決於微控制器,但似乎是每分鐘一次左右。

請求基本要求,「夥計,得到了我新的東西?「

你的web應用程序需要發送的答案,‘不是現在’或者‘這裏就是我的。’

您的應用程序的其他部分提供有關資料,而且它與微控制器這樣做異步(也就是說,只要就是了)。

爲了使微控制器的查詢效率是你現在的目標。

(請注意,如果我有任何這些假設錯了,請大家指正。)

你的桌子會需要一個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; 

這將檢索最新的值1和值2項(您的應用程序的數據,不管它是什麼),如果自上次查詢以來已更新。處理來自微控制器的請求的你的php程序可以響應這些數據。

如果SELECT語句不返回任何行,那麼您的php代碼將以「無變化」響應微控制器。

這一切都假設microcontroller_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代碼投票在一個循環的數據庫。相反,當您的微控制器檢查更新時,您可以查詢數據庫/

+0

你釘它的99%,我非常感謝你爲你的response.So爲什麼循環......我希望該系統能儘可能快......而是然後在客戶端連續發送我認爲它的請求會更有效,更快地具有開放60秒的連接,同時一個PHP腳本檢查是否有任何的loop.If一切都沒有改變已關閉連接,然後立即一個新的請求從客戶端發送以下。要採取一些當一個記錄被更新更改日誌文件可能被更新的數據庫的壓力..循環可能只是檢查日誌文件... –

+0

我真的很感謝您迴應並很詳細! –

+0

Ollie id喜歡聽到您對我的評論的迴應。 –

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 
} 
+0

如果當數據被插入我寫的變化到一個文件...然後有一個不斷檢查文件的更新循環.. –

+0

爲什麼你需要的文件?你不能在你確定變更時執行所需的行動嗎? –

+0

由於終端設備是一個客戶端,即微控制器......我不知道一種方法將數據傳遞到客戶端,而無需設置端口轉發......這是非常不希望的......當嘗試時出現問題將數據從外部網絡發送到內部... A.端口轉發或B讓客戶端設備發起請求,這使我想到讓設備發送一個http請求到文件來輪詢更改...... 。 –

相關問題