PHP会话未更新

时间:2017-04-25 11:46:18

标签: php session background chat

我正在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 !

我不明白为什么,这让我发疯了......请帮忙!

1 个答案:

答案 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;