簡體   English   中英

php會話保持活動以檢查活動

[英]php session keep alive to check activity

我了解到,有一種方法可以每隔30秒左右檢查一次用戶是否仍在網站上,如果沒有,請注銷(或執行其他操作)

我有一個基本的不活動注銷,但是僅當用戶在網站上時才有效,但是如果用戶關閉瀏覽器/選項卡,它將不起作用

    if (isset($_SESSION['time'])) {
        $elapsed_time = time() - $_SESSION['time'];
        if ($elapsed_time >= 900) {
            mysql_query("UPDATE `users` SET `status` = '0' WHERE `user_id` = '$session_user_id'");
            session_destroy();
            header('Location:index.php');
        }
    }
    $_SESSION['time'] = time();

我該怎么做才能使狀態僅在X閑置時間后才變為0(但不必注銷用戶-只需更改狀態)?

鈎住會話保存處理程序功能,特別是垃圾收集功能之一。

雖然以下示例顯示了刪除,但是您可以輕松地對其進行修改,以僅設置一個不活動標志,然后可以從您的不活動腳本中讀取該標志。

session_set_save_handler文檔

PHP <5.4來自: http : //www.sitepoint.com/writing-custom-session-handlers/

session_set_save_handler("open", "close", "read", "write", "destroy", "garbage");
function gc($lifetime) {
    $db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
    $sql = "DELETE FROM session WHERE session_lastaccesstime < DATE_SUB(NOW(), INTERVAL " . $lifetime . " SECOND)";
    $db->query($sql);
}
//below ones are covered in the article.
function open(){}
function close(){}
function read(){}
function write(){}
function destroy(){}

Php 5.4+來自: http ://www.php.net/manual/zh/class.sessionhandlerinterface.php#example-4769

注意:此示例基於文件,您只需對其進行修改即可使用數據庫

<?php
class MySessionHandler implements SessionHandlerInterface
{
    public function gc($maxlifetime)
    {
        foreach (glob("$this->savePath/sess_*") as $file) {
            if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
                unlink($file);
            }
        }

        return true;
    }
    //below functions are covered in the manual
    public function open($savePath, $sessionName){}
    public function close(){}
    public function read($id){}
    public function write($id, $data){}
    public function destroy($id){}
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

兩者都依賴大量訪問您網站的用戶。 否則,例如,如果您連續幾天都沒有獲得用戶,那么類似的垃圾收集功能將無法運行數天。 在這種情況下,您將不得不設置其他系統(例如cron作業)來頻繁地觸發腳本。

使用以下cron刪除文件:

find .session/ -amin +20  -exec rm {} \;

這將刪除20分鍾未訪問的會話文件。 假設您是服務器上的唯一人員,這將刪除所有PHP會話。

在此問題中指定了執行此操作的更多方法: 清理php會話文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM