2015-09-16 4 views
0

Я пытался понять, как работает сон для множественного запроса с той же машины.Как сон работает в PHP для одновременных запросов от одного и того же пользователя [машины]?

Например, я хочу, чтобы отслеживать логин пользователя и выход из системы в одном из моего приложения, и я сделал, как описано ниже:

Ajax запрос отправляется в браузер, когда пользователь пытается закрыть/обновить текущий браузер , То, что я сделал это переплетено событие на странице выгрузке, которая отправляет Ajax запрос на сервере, где я настроил значение сеанса временной метки в сессии и использовал сон (10), как показано ниже ->

//sets the timestamp value 
    $session->timestamp = time(); 

    //wait if another request arrives withing 10 seconds 
    sleep(10); 

    if ($session->timestamp) { 

     //clear user session here 
     $session->timestamp = null; 
    } 

С Я хочу только сбросить сеанс только тогда, когда пользователь пытается закрыть вкладку/окно браузера, в этом случае он отлично работает и перезагружает сеанс через 10 секунд.

Но я не хочу перезапускать сеанс в случае обновления страницы. Поскольку в случае обновления страницы снова вызывается событие разгрузки страницы, которое устанавливает значение временной метки в сеансе, но запрос выполняется для обновления, и он устанавливает значение метки времени в самом первом месте, как показано ниже:

if ($session->timestamp) { 
     $session->timestamp = null; 
    } 

Теперь, о чем я думаю, когда 10 секунд завершено во время вызова предыдущего запроса, значение timestamp имеет значение null, и поэтому сеанс пользователя не должен быть сброшен.

Но как-то это не так. Может быть, я что-то упустил. Может кто-то, пожалуйста, помогите мне на этом?

+4

Я очень смущен. Кажется, вы пытаетесь изобрести сборку мусора для сеансов. Достаточно литературы по этому вопросу. – Halcyon

+0

На самом деле мне нужно отслеживать активность входа/выхода пользователя в мое приложение. Но когда пользователь напрямую закрывает сеанс, нет трека, который либо вышел из системы, либо нет. –

+0

Для этого я добавил событие «onunload», которое отправляется на сервер, и устанавливает значение «timestamp» и заставляет процесс спать за «10 секунд» и ничего не возвращает. Но так как пользователь просто обновляет страницу, он сбрасывает значение timestamp из сеанса. и поэтому я думал, что, когда предыдущий запрос пробуждается [через 10 секунд], он не получит значение timestamp и не должен очищать сеанс пользователя. –

ответ

0

Если вы хотите уничтожить сеанс пользователя после закрытия браузера, просто установите cookie без истечения срока действия.

+0

, но я также хочу зарегистрировать зарегистрированное событие в моей базе данных. –

+0

Вы можете проверить с помощью задачи cron, для входа пользователя в систему> x минут. – Thobakr

0

Вы только объяснили свою проблему в комментариях - не в вопросе. Каждый HTTP-запрос обрабатывается изолированно, независимо от того, находятся ли они с одного и того же компьютера, однако, когда клиент передает HTTP-запрос, он может повторно использовать существующее соединение, и в этом случае запрос будет заблокирован до тех пор, пока предыдущий запрос в том же сокете не будет обработанный.

мне нужно отслеживать Логин/выход из системы активности пользователя в моем приложении

Правильный способ сделать это в обработчик сеанса (а не встраивание информации о время внутри самой сессии) или через SSO. Вы можете установить очень короткий TTL и использовать активированный javascript маяк, чтобы получить лучшую детализацию конца сеанса в отсутствие явного выхода из системы.

+0

Не могли бы вы объяснить, как это сделать в PHP + Javascript или предоставить ссылки для решения, которое вы предоставляете? –

0

Если пользователь специально не выйдет из системы, не будет событием выхода из системы. Из-за того, как работают веб-сайты, вы не можете заставить пользователя выйти из системы. Обычно сеансы просто таймаут (30 минут - довольно распространенное значение). Если своевременный выход из системы является важным для вас, подумайте о том, чтобы переключить его и внедрить тикер keep-alive, который будет периодически (каждые 5 минут?) Отправлять серверу сообщение, которое пользователь все еще зарегистрировал (= открыт сайт на вкладке) ,

В таблице сеансов хранятся временные метки последнего уведомления, если эта временная метка слишком старая, вы можете считать, что пользователь вышел из системы. Запустите запланированное задание для записи «события».

Использование onunload для выполнения запроса AJAX очень ненадежно, потому что вы не можете заставить браузер ждать, и вы не можете разжигать между перезагрузкой/перенаправлением или закрытием.

Смежные вопросы