Я пытаюсь найти метод для выполнения некоторых PHP-кода, как только пользователь закрывает страницу. В моем приложении, когда пользователь закрывает или перемещается в сторону от страницы, сервер будет указывать пользователя как «автономный» в базе данных. Это требует, чтобы код знал, когда пользователь перешел от страницы. Мое приложение также имеет бесконечную нагрузку (т.е. он будет спать до тех пор, пока пользователь не закроет страницу).
Редактировать:
Спасибо за ответы. Я решил пойти с методом сессии Пекки, поскольку это казалось наиболее логичным для моего приложения.
ура
Надежная отправка события, когда пользователь закрывает страницу, практически невозможен. Существует событие onbeforeunload
которое может выполнять вызов Ajax, но это может завершиться неудачей, не выполняться по соображениям безопасности или вообще не выполняться, поскольку пользователь отключил JavaScript.
Обычно это делается через тайм-ауты сеанса: он проверяется, когда последний запрос был выполнен. Если это было больше, чем x минут назад, сеанс обрабатывается как истек. Разве это не вариант?
Запросы страниц являются безстоящими, что означает, что у вас никогда не будет 100% -ного рабочего метода обнаружения, чтобы определить, покинул ли кто-нибудь страницу. Вы можете попытаться поймать разгрузку страницы, но это не на 100% точно. Вы также можете попробовать, как @Nayena, упомянутые в AJAX, но это меньше, чем идеально.
Лучше всего делать то, что делают большинство обычных сайтов, использовать «последнюю активность в течение N минут» в качестве индикатора и не пытаться поймать, когда они перемещаются или закрывают страницу.
Если вы добавите скрипт ajax, обновляющийся через 5-10 секунд, вы можете обновить последнюю обновленную печать через файл php, который вызвал запрос ajax, и если он старше 10 секунд, он отключен. Это, безусловно, может быть более чистым решением 🙂
Если вы можете использовать Javascript и JQuery, используйте «window.onclose», а затем вызов Ajax, чтобы делать все, что хотите, используя PHP:
Захват события onclose browser
// Javascript code window.onclose = closing; function closing(){ $.ajax({ url: 'yoururl.php', data: yourdata, success: function(content){ // empty } }) }
Просто установите ignore_user_abort(true)
затем введите бесконечный цикл while
while (!connection_aborted()){ // do nothing ... } //after the while loop : some_function_to_say_that_the_user_is_offline();
но будьте осторожны, всякий раз, когда пользователь переходит из страницы, функция WILL будет выполнена.
EDIT: и индикатор выполнения браузера будет выглядеть как «загрузка …» навсегда …
Изменить 2: проверьте также http://www.php.net/manual/en/function.register-shutdown-function.php
Использовать атрибут Body onunload
http://www.htmlcodetutorial.com/document/_BODY_onUnload.html