2012-02-20 36 views
3

我在PHP中創建了一個類似於事物的聊天框。唯一的問題是它不會自動重新加載。有沒有辦法讓它在PHP中重新加載,或者我必須移動所有東西,這樣我才能使用AJAX?另外,我的一位用戶不斷在線。如果他們按下某個鍵或在最近3分鐘內點擊並在離開頁面時將其設置爲離線,我已將其設置爲脫機。他們正在使用Firefox 9.0。這是因爲使用onunload?什麼是解決方案?PHP重新加載聊天框?

回答

4

您可以使用meta refresh標籤,它可以由PHP生成,但它並不是一個真正的PHP特有功能。

<meta http-equiv="refresh" content="600"> 

這將刷新600秒後的內容。根據您的應用需求,您可以更準確地節約時間。

Ajax可能是檢查用戶不活動的首選方法。下面是一個類似的職位上檢查用戶活動 - How can I detect with JavaScript/jQuery if the user is currently active on the page?

UPDATE

至於如何處理用戶退出Firefox中的第二個問題,它就像你說onunload可以不一致。這是再次使用ajax的地方。如果您的應用程序停止從客戶端接收ajax更新,則可以執行某種清理以將其標記爲非活動狀態。

我們在ASP.Net MVC應用程序中有類似的情況。我們最終使用應用程序變量來存儲最近的活動和用戶狀態。一個php例子可以是found here

希望這會有所幫助!

+0

是的,我使用AJAX將某人標記爲離線。因爲我們在他們離開頁面時處於不活動狀態時使用了相同的功能,所以此功能似乎不適用於Firefox 9.0 – CoffeeRain 2012-02-20 15:35:00

+0

@shanabus,這是兩個問題,第二個問題甚至沒有詳細信息。 – Alexander 2012-02-20 15:35:47

+0

@亞歷山大,我想我現在已經談到了這個問題的第二部分。謝謝! – shanabus 2012-02-20 15:44:21

2

您可以添加一些JavaScript來自動刷新整個頁面,但對於最終用戶來說,使用AJAX會更好。

+0

他也可以使用jQuery並加載到一些容器腳本get.php。我寫了上面的解決方案聊天,它工作正常。 – Kobra 2012-02-20 15:34:38

+1

我使用AJAX作爲「無需重新加載頁面而獲取某些數據」的總稱。 – 2012-02-20 15:43:58

2

Facebook這樣做的方式是,客戶端「Alice」有一個掛起的新消息請求約1分鐘。如果另一個客戶端「Bob」向Alice寫入消息,則服務器可以完成Alice的未決請求。然後,Alice立即獲得新消息並打開新的待處理請求。

大約一分鐘後您將不得不暫停待處理的請求,或者瀏覽器執行此操作。不同的瀏覽器有不同的超時設置,所以只需使用一些小的。在超時之後,你打開一個新的掛起請求,不會錯過任何東西。

我得到了一些代碼,以玩: listen.php(客戶端調用它來創建掛起的請求,等待事件$ EID的消息NR $ MNR

define('WAIT_MAX', 55); // wait max 55 sec 
define('WAIT_INT', 1); // wait 1 sec per call 

$start = time(); 
while ($start + WAIT_MAX > time()) 
{ 
    // check if an event occured 
    $res = mysql_query('SELECT * FROM event WHERE `eid`="'.$eid.'" AND `mnr`="'.$mnr.'"'); 

    if (mysql_num_rows($res) > 0) 
    { 
     // event occured 
     $row = mysql_fetch_assoc($res); 
     $msg = $row['msg']; 

     echo "<event eid=\"$eid\" mnr=\"$mnr\" msg=\"$msg\" />\n"; 
     die(); 
     //die('event occured: '.$msg."<br>\nNext mnr=".($mnr+1)); 
     //break; 
    } 
    else 
    { 
     // no event occured 
     mysql_free_result($res); 
     sleep(WAIT_INT); 
    } 
} 
die(WAIT_MAX . ' seconds passed and no event occured.'); 

鮑勃發送它的消息。 yell.php提供$味精

if (isset($_GET['msg'])) 
    $msg = $_GET['msg']; 
else 
    $msg = 'no message given, just firing the event.'; 

mysql_query('INSERT INTO `event` (`eid`, `mnr`, `msg`) VALUES ("'.$eid.'", "'.$mnr.'", "'.$msg.'")'); 

一些的init.php,使其工作:

$eid = -1; 
$mnr = -1; 

if (isset($_GET['eid']) && isset($_GET['mnr'])) 
{ 
    $eid = max(0, (int)$_GET['eid']); 
    $mnr = max(0, (int)$_GET['mnr']); 
} 
elseif (isset($_GET['eid'])) 
{ 
    $eid = max(0, (int)$_GET['eid']); 
    $mnr = 1; 
} 
else 
    die('no eid given'); 

只要你喜歡就使用和修改這段代碼。