我正在php / ajax中建立聊天。为了检测用户超时,我编写了一个后台php脚本,如果5秒内没有活动,则会断开用户的连接。
问题是,会话中的变量没有更新......
这是我的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 :(得分: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;