2013-07-30 46 views
2

我正在考慮3個選項,如果有任何問題,我會考慮更多的建議。在循環中查詢數據庫,使用睡眠或單獨請求循環

問題:我不斷收到建議溝睡眠,我沒有背景三個

我之間保持回暖斥罵睡眠是非常糟糕的PHP腳本使用,但從來沒有人強調過爲什麼。我打算讓系統具有可擴展性,即解決這個問題的方法可以使用10到100倍。

選項1:睡眠

$timer = time() + (30); 

while($done==0){ 
    $result = mysqli_query($mysqli, $query); 
    $row_cnt = mysqli_num_rows($result); 

    if ($row_cnt>0){ 
    $row = mysqli_fetch_array($result); 
    print $row[0]; 
    $done=1;} 

    else{ 
    $current = time(); 
    if($timer>$current){sleep(1);} 
    else{$done=1;} 
    } 

選項2:

只需從我上面的非服務器知識除去睡眠認爲這是糟糕的,但是,我敢肯定,我可能是非常錯誤的

else{ 
    $current = time(); 
    if( $timer>$current){} 
    else{$done=1;} 
} 

選項3:讓客戶端請求循環中的頁面並讓該文件只顯示信息

$result = mysqli_query($mysqli,$query); 
$row_cnt = mysqli_num_rows($result); 

if ($row_cnt>0){ 
    $row = mysqli_fetch_array($result); 
    print $row[0]; 

因此,這是最好的給 我的目標:

  • 可靠性最重要
  • 速度,這客戶端獲取信息
  • 可擴展性 - 重要性最低(仍然很重要)

請給我一個爲什麼我真的想理解一種方法是優越的說法

如果這被標記爲有爭議的,它必須意味着所有的答案都是有效的:)我將其作爲答案:)

+1

你想解決什麼問題? – Barmar

+1

問題是我一直建議溝渠睡眠,我沒有背景選擇之間的三個 –

+1

爲什麼你有睡覺在第一個地方?據推測,這是爲了解決一些問題,因爲在數據庫查詢腳本中這是不正常的。 – Barmar

回答

1

我會採取刺探爲什麼程序員認爲sleep壞在一個循環,這似乎成爲你問題的核心。

簡短的回答,是的,你可以使用睡眠。

爲什麼你不是呢?

什麼理想想要做的一些工作,當數據變得可用的數據庫。爲此,如果您可以在數據可用時得到通知,那麼您已經完成了最少量的工作。在編程中有多種方式可以實現這一點:HTTP世界中的webhooks,鎖/信號量,回調以及事件/觀察者是一些範例。另一個引用的原因是race conditions,我會讓你讀一讀。由於數據庫正在爲您自動執行任務,因此這不是一個擔心。

但是,在理想的無狀態世界即HTTP中,您無法鎖定,有時您根本無法獲取事件或回調。我見過一些AJAX編程鼓勵使用固定或隨機間隔的輪詢,就服務器而言,這本質上是一種睡眠形式。

您的選擇2是最糟糕的,因爲您的程序正在做大量無用的工作。所有這些無用的工作都會耗費你的電力和佔用資源(CPU),而這些資源可能會轉移到其他地方。如果您登錄到計算機,運行任何其他程序,爲網站提供服務,所有這些都會變慢。

+0

我真的很感謝你的迴應。所以如果你不得不說3或1會更好嗎? –

+0

3或1看起來不錯 - 儘管我並不完全知道 –

+0

100人連接到服務器,並在睡眠循環中〜= 100人連接到服務器一遍又一遍...好奇好奇至於爲什麼整個圖片很重要......你錯過了什麼數據來作出結論 –