2012-01-11 30 views
0

Demo.php文件更新div標籤,如果html文件更新?

<?php 
function write_back() 
{ 
    echo file_get_contents("sample.html"); 
    sleep(2); 
    write_back(); 
} 
write_back(); 
?> 

導致我這個錯誤Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\omnama\demo.php on line 8

我從PHP腳本的HTML內容的迴音,爲每2秒Ajax請求。

Demo.html文件

function loadXMLDoc() 
{ 
var xmlhttp; 
    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 
    xmlhttp.open("GET","demo.php",true); 
    xmlhttp.send(); 
} 

讓我解釋什麼,我試圖做的。我有一個不斷更新的sample.html文件,它可能包含當前登錄的用戶數量或可用於討論的人數等等。

我已經使用了一個html文件,因爲無論何時一個新用戶登錄,該html文件將更新爲使用PHP文件概念的用戶名,然後這些html文件應該更新爲所有在線用戶。所以即時更新<div id="myDiv">標籤與反應給出的demo.php文件

我已經使用HTML文件,因爲每次請求MySql檢查是否有人登錄,將導致嚴重的服務器問題,這就是爲什麼我想使用HTML文件。但回聲文件內容每次都給我這些錯誤。

我正在考慮這樣做。只需檢查文件的上次修改時間,如果與上一次修改時間不同,則回顯其內容,這是正確的方法嗎?

任何人都可以解釋我如何跟蹤sample.html並將其內容更新到登錄用戶?我需要一些幫助。謝謝

+0

我可能錯過了這個問題,但爲什麼不使用JavaScript的setInterval來執行每個間隔的新的ajax請求? -http://www.w3schools.com/jsref/met_win_setinterval.asp - 編輯:好吧,我現在已經知道了,我會在下面寫出更完整的答案... – mobius 2012-01-11 09:26:49

+0

@mobius同樣的錯誤報告 – niko 2012-01-11 09:43:04

+0

這個想法與setInterval將從服務器端刪除睡眠(2)並將其放置在瀏覽器上。但看到我的完整答案更多。 – mobius 2012-01-11 09:52:05

回答

0

可能有幾種方法可以去解決這個問題,並且最終我猜這取決於你有多少請求/更新。

但是我覺得首先你需要決定你將如何檢索您感興趣的結果

  • 簡單的解決辦法:你可以使用的setInterval(),並讓瀏覽器執行新的服務器上的XmlHttpRequest(POLL)以特定的預定間隔檢索新的用戶列表

  • 更復雜的解決方案:您可以在服務器和瀏覽器之間建立一個「網絡套接字」連接,然後按下瀏覽器用戶的列表。你可以設置一個像服務器一樣的彗星,長輪詢自定義實現,或者一個socket.io(http://socket.io/ - 我是一個巨大的粉絲),並讓服務器通知監聽瀏覽器值得通知發生。

現在到服務器端:

個人而言,我真的不喜歡不必編寫一個HTML文件,以避免數據庫查詢你的方法。顯而易見的方法是根據請求查詢數據庫中的新用戶並回復。有這麼多的用戶會導致服務器瓶頸嗎?如果是的話,你可以添加更多的服務器? (mysql複製只是爲了這個嗎?)如果你在請求中添加了時間戳(即告訴我自XXX以來發生了什麼變化),你可以加快查詢速度。

你有沒有其他的選擇?即如果最終使用socket.io,則可以通過服務器端的套接字狀態來處理整個在線脫機狀態,而無需其他任何操作。 (socket.io服務器知道哪些客戶端連接到它)。

另一個想法可能是保持在線用戶訪問內存存儲,如memcached或redis服務器。因此,在每次登錄/註銷時,您都會更新一個memcached服務器,並相應地從中檢索結果。

如果我花更多時間在上面,我可能會想到更多的方法來解決這個問題。然而,如果您確實需要所有這些,而且無法使用簡單的SQL查詢,則需要確定的是。

+0

謝謝mobius我會看看它,但試圖給我一些更多的信息謝謝 – niko 2012-01-11 10:02:30

+0

@niko在哪個主題,你需要更多的信息? – mobius 2012-01-11 10:10:12

0

我不認爲使用遞歸函數write_back是一個好主意。 每2秒使用ajax發送xmlhttprequest(setTimeout或setInterval)可能會更好, 或者您可以使用comet技術。 要回答的第一個問題,希望這些幫助。