2011-04-13 30 views
0

有人知道如何在用戶退出瀏覽器或瀏覽頁面時更新mysql數據庫嗎?我有一個值設置爲1,並希望它在這種事件中設置爲0。這幾周我一直把頭撞在牆上,任何幫助都會得到大量的讚賞,謝謝。我使用PHP。我已經嘗試過對身體卸載,但它沒有做我想要的。在瀏覽器退出時更新數據庫

+1

'我有一個值設置爲1,並希望在這樣的情況下設置爲0 。 - 你使用這個值來檢查在線/離線用戶嗎? – drudge 2011-04-13 18:26:01

+2

爲什麼'onUnload'不適合你?這聽起來像你正在尋找的東西。 – eykanal 2011-04-13 18:29:38

+0

@eykanal:大多數瀏覽器不允許在卸載期間(之前)以及在某些(差)瀏覽器中發送ajax請求,但您有競爭條件:異步ajax請求是在窗口關閉之前發送的嗎?您絕對不希望在(之前)卸載期間發送ajax請求。 – BalusC 2011-04-13 18:49:17

回答

4

不要這樣做。僅僅因爲您依靠瀏覽器向您發送通知(通過beforeunload事件)或其他一些機制。如果瀏覽器崩潰,或者用戶把他的電腦休眠/休眠,會發生什麼?

您可能會考慮其他選項,如PING!方法,瀏覽器可以通過Ajax調用每隔1分鐘發送一次,告訴他還活着。所有你需要做的就是創建一個MySQL程序,它可以掃描超過1:30分鐘的任何「活動」條目(調用last_seen TIMESTAMP或其他),並將其設置爲「活動」爲0.此過程可能是在隨機請求中調用(非常類似於PHP會話清理機制)。

這將確保用戶仍然存在,因爲您將得到PING!請求定期和當用戶停止,你將能夠安全地說,他不會PING!了(雖然會造成輕微的延遲,但是可以接受)。這也將確保用戶安全。

0

PHP只能在頁面被訪問時改變事物。從PHP的角度來看,只要腳本結束,事務就結束了,並且與該頁面無關。

做到這一點的唯一方法是保持連接打開,腳本運行,並使用這樣的:

<?php 

    function shutdown() 
    { 
    // here you change the value on your db... 
    } 

    register_shutdown_function('shutdown'); 

// send the data to client 
    echo "anything"; 
    flush(); 
    // sleep for a lot of time... 99999 seconds... 
    sleep(99999); 
?> 
+0

一些虛擬主機會在幾秒後「殺死」PHP進程(比如1和1上的25),所以這是不切實際的。此外,對於少數用戶來說可能會很好,但這也會打開洪水攻擊...... – 2011-04-13 18:42:58