2011-02-01 63 views
4

我試圖找到一種方法來在用戶關閉頁面後執行一些PHP代碼。在我的應用程序中,一旦用戶關閉或導航離開頁面,服務器將在數據庫中聲明用戶爲「離線」。這要求代碼知道用戶何時離開頁面導航。我的應用程序也有無盡的負載(即它會在用戶關閉頁面之前休眠)。PHP在頁面關閉時執行代碼

編輯:

感謝您的答案。我決定採用Pekka的會話方法,因爲這對我的應用來說似乎是最合乎邏輯的。

乾杯

+3

將數據庫中的每個用戶操作註冊爲`timestamp`,然後檢查用戶在最後(n)分鐘內是否處於活動狀態。這就是每個人都做的,而且是100%工作的唯一途徑。 – Shoe 2011-02-01 15:46:58

回答

9

當用戶關閉頁面時可靠地發送一個事件幾乎是不可能的。有可以執行Ajax調用的onbeforeunload事件,但可能會失敗,出於安全原因不會執行,或者根本不執行,因爲用戶關閉了JavaScript。

這通常是通過會話超時完成的:當某個會話的請求最後一次發生時,會檢查它。如果時間超過x分鐘,會話將視爲過期。這不是一個選項嗎?

+0

是的,這似乎是最佳做法。你的回答讓我更多地思考如何做到這一點,而且看起來似乎比其他提到的方法更符合邏輯。謝謝! – 2011-02-01 16:11:08

3

如果你放入一個在5-10秒後刷新的ajax腳本,你可以通過ajax請求調用的php文件更新上次更新的戳記,並且如果它超過10秒就會脫機。這當然可以是一個更清潔的解決方案:-)

4

頁面請求是無狀態的,這意味着你永遠不會有一個100%的工作檢測方法來確定是否有人離開了頁面。您可以嘗試抓取頁面卸載,但這不是100%準確。你也可以嘗試使用AJAX提到的@Nayena,但這並不理想。

最好的辦法是像大多數常見網站那樣做,使用「N分鐘內的最後一次活動」作爲指標,而不是在他們離開或關閉頁面時趕上。

+0

你可以檢查用戶是否已經從PHP內部瀏覽頁面(不是網站),但這意味着連接將保持打開狀態(瀏覽器中的加載進度將工作到無窮遠)..檢查我的回答 – 2011-02-01 15:46:36

+0

@Ranan :我也可以使用AJAX推送服務,或者保持活動連接的隱藏閃光插件,或者....(並不意味着它們中的任何一個對於服務器來說都是理想的或者好的)。我將選擇「超時」方法,並讓我的服務器線程在上述任何一天的任何一天的任何一天打開。 [除非商業模式需要這種開銷。但至於「用戶離開了嗎?」 - 不值得資源] – 2011-02-01 15:50:30

+0

)我知道,但他說'執行一些PHP代碼'和'我的應用程序也有無盡的負載(即它會睡覺,直到用戶關閉頁面)。'' ,那爲什麼不用這個方法? – 2011-02-01 15:54:26

0

如果你可以使用JavaScript和JQuery,使用 'window.onclose',然後調用Ajax做任何你想要使用PHP:

Capture event onclose browser

// Javascript code 
window.onclose = closing; 

function closing(){ 
    $.ajax({ 
    url: 'yoururl.php', 
    data: yourdata, 
    success: function(content){ 
      // empty 
    } 
    }) 
} 
0

只需設置ignore_user_abort(true)然後進入無限while循環的

while (!connection_aborted()){ 
     // do nothing ... 
    } 

//after the while loop : 
some_function_to_say_that_the_user_is_offline(); 

但要小心,無論何時用戶導航出頁面,函數將被執行。

編輯:和瀏覽器的進度條會像 「下載...」 永遠...

編輯2:同時檢查http://www.php.net/manual/en/function.register-shutdown-function.php