2017-04-25 67 views
0

我正在建立一個在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 ! 

我不明白爲什麼它的駕駛我瘋了......請幫幫忙!

+0

當你調用腳本中的'$ _SESSION'戰爭不僅填補一次。如果其他人在執行腳本時更改會話變量,則此更改不會填充到當前腳本中 – Philipp

+0

@Philipp這是調用相同腳本的同一用戶,因此他可能具有相同的會話 – ShellCode

+0

當您打開會話時在一個腳本中,它被阻塞,所以你不能同時有2個腳本/請求訪問同一個會話。一旦會話打開,另一個請求將不得不等待,直到第一個腳本完成。 – jeroen

回答

1

$ _SESSION數組是在session_start啓動的,但是在它不會被用戶聊天腳本修改之後。 您應該使用chat.php寫入上次訪問時間的每個會話文件。後臺進程必須在while塊中讀取該文件。

聊天腳本:

<?php 
session_save_path("sessions"); 
session_start(); 
file_put_contents('access_' . session_id() . '.txt', time()); 

後臺進程:

<?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 = file_get_contents('access_' . session_id() . '.txt'); 

while(time() - intval($lastrequest) < 5) { //5 seconds 
    echo "last_request : " . $lastrequest . PHP_EOL; 
    $lastrequest = file_get_contents('access_' . session_id() . '.txt'); 
    sleep(1); 
} 

echo "disconnecting user !" . PHP_EOL; 
+0

非常感謝您的回答,即使這不是我所做的,我知道它會起作用!我更喜歡@jeroen告訴我的方式(通過關閉並重新開啓會話),因爲我不必管理任何文件。但你的答案是唯一的,我知道這是一個很好的答案,所以我將其標記爲正確;) – ShellCode

+0

好吧,我明白你爲什麼更好。謝謝你! :) – TrX