Я строю чат в 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 !
Я не понимаю почему, и это сводит меня с ума … Пожалуйста, помогите!
Массив $ _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;
Других решений пока нет …