[英]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(但不必注銷用戶-只需更改狀態)?
鈎住會話保存處理程序功能,特別是垃圾收集功能之一。
雖然以下示例顯示了刪除,但是您可以輕松地對其進行修改,以僅設置一個不活動標志,然后可以從您的不活動腳本中讀取該標志。
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.