PHP сессия не обновляется

Я строю чат в 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

Решение

Массив $ _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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector