Итак, вот что я сделал:
Я добавил колонку к своему users
таблица в моей БД, столбец называется logged_in
, я устанавливаю его в 1, когда пользователь входит в систему, и я устанавливаю его в 0, когда пользователь выходит из системы (и затем я использую это, чтобы показать пользователю, если его друзья в сети или нет, проверив этот столбец для каждого из его / ее друзей ).
Я также должен держать пользователя вошедшим в систему каждый раз, когда он входит в систему, пока он не выйдет вручную, нажав кнопку выхода из системы, поэтому я использую файлы cookie.
Все это будет прекрасно работать, если пользователь всегда выходит из системы, нажимая кнопку выхода на моем веб-сайте (или если мне каким-то образом разрешают обновлять столбец «logged_in» в моей базе данных всякий раз, когда пользователь удаляет свои куки (невозможно)).
Итак, вот что приводит к моей проблеме:
Всякий раз, когда пользователь удаляет свои куки, мой код неправильно читает их logged_in
столбец в моей БД, как 1
хотя пользователь теперь будет выходить из системы (что приводит к тому, что его друзья видят его «онлайн», а не «оффлайн»), эта ошибка сохраняется до тех пор, пока пользователь не войдет в систему, а затем снова не выйдет вручную (нажатием кнопки выхода), но это будет происходить каждый раз, когда пользователь очищает свои куки.
Причина, по которой я не использую ничего, связанное со временем (проверяйте активность пользователя каждый раз x
секунд) для автоматического входа-выхода пользователей, потому что я должен держать пользователя вошедшим в систему.
Итак, моя проблема, наконец:
Пользователи должны быть в состоянии выйти из системы только вручную, нажав кнопку «Выйти» на моем веб-сайте. В настоящее время я достигаю этого, сохраняя их в системе с помощью файлов cookie (чтобы они не могли выйти из системы, закрывая мой веб-сайт или закрывая браузер), но когда они удаляют свои файлы cookie, этот пользователь превзошел мой первый закон, а теперь и мою базу данных. Ошибочно полагает, что пользователь все еще вошел в систему.
Вы используете функцию ajax для проверки связи с кодом пользователя. Затем вы можете поставить отметку времени и записать запрос. Чтобы проверить, что пользователь онлайн, проверьте, что последний пинг был в течение x времени от настоящего момента.
Это также позволит вам профилировать другую полезную информацию о ваших активных пользователях / пользователях с вкладками
Я бы рекомендовал добавить новую таблицу сессий с двумя столбцами; один для идентификатора пользователя и другой для «последнего активного» столбца метки времени.
Затем вы просто добавляете строку для пользователя при входе в систему и обновляете столбец отметки времени всякий раз, когда браузер пользователя отправляет запрос на ваш сервер для получения обновленного чата.
Чтобы получить список онлайн-пользователей, вам нужно просто запросить в столбце метки времени значения за последние пять минут.
И когда пользователь выходит из системы, удалите строку для пользователя.
В качестве альтернативы моему другому ответу (поскольку я читаю, что вы не можете полагаться на время); Предполагая, что вы в настоящее время используете AJAX, вы можете переключиться на использование Websockets; что позволит вам увидеть, когда соединение закрывается.
Я, вероятно, рекомендую использовать трещотка, для PHP Websockets.