我正在建立一個在php/ajax聊天。爲了檢測用戶超時,我編寫了一個後臺php腳本,如果5秒鐘內沒有任何活動,將斷開用戶連接。PHP會話未更新
是,在會話變量不更新的問題...
這裏是我的chat.php,所有的AJAX查詢的執行(至少1每秒和每個客戶端):
<?php
session_save_path("sessions");
session_start();
$_SESSION['last_request'] = time();
這裏是我從這個chat.php啓動背景腳本:
exec('php user_manager.php ' . session_id() . ' > /tmp/output &');
這裏是我的循環,以檢查用戶是否仍然在這裏(這是後臺進程):
<?php
session_save_path("sessions");
session_id($argv[1]);
session_start();
ignore_user_abort(true);
set_time_limit(0);
echo "background task starting on user " . $_SESSION['user'] . PHP_EOL;
$lastrequest = $_SESSION["last_request"];
while(time() - intval($lastrequest) < 5) { //5 seconds
echo "last_request : " . $lastrequest . PHP_EOL;
$lastrequest = $_SESSION["last_request"];
sleep(1);
}
echo "disconnecting user !" . PHP_EOL;
正如你所看到的,last_request會話變量從不更新:
# cat /tmp/output
background task starting on user test
last_request : 1493120020
last_request : 1493120020
last_request : 1493120020
last_request : 1493120020
last_request : 1493120020
disconnecting user !
我不明白爲什麼它的駕駛我瘋了......請幫幫忙!
當你調用腳本中的'$ _SESSION'戰爭不僅填補一次。如果其他人在執行腳本時更改會話變量,則此更改不會填充到當前腳本中 – Philipp
@Philipp這是調用相同腳本的同一用戶,因此他可能具有相同的會話 – ShellCode
當您打開會話時在一個腳本中,它被阻塞,所以你不能同時有2個腳本/請求訪問同一個會話。一旦會話打開,另一個請求將不得不等待,直到第一個腳本完成。 – jeroen