PHP долго работает бесконечно - PullRequest
1 голос
/ 01 сентября 2011

Я занимаюсь созданием веб-сайта с функциями чата, и мне нужно отслеживать онлайн и офлайн пользователей.Для отслеживания онлайн-пользователей я использую эту таблицу

user_id |отметка времени

Я обновляю отметку времени каждые 20 секунд для всех онлайн-пользователей. Таким образом, я могу узнать, кто все не в сети, просто сравнив текущую отметку времени с отметкой времени в таблице.

Теперьпроблема заключается в следующем: я использовал длинный опрос для обновления онлайн-статуса пользователей. Именно тогда, когда пользователь входит в систему, я запускаю ajax-вызов скрипта, который выглядит следующим образом.

<?php
set_time_limit(0);

while(1){
  updateUserTimestamp();
  sleep(20);
}
?>

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

Пожалуйста, помогите.

Ответы [ 5 ]

4 голосов
/ 01 сентября 2011

Попробуйте следующее решение (см. документацию по функции connection_aborted () ):

<?php
set_time_limit(0);

while(!connection_aborted()){
    updateUserTimestamp();
    sleep(20);
}

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

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

  1. отказаться от использования длинных опросов в пользу частых запросов AJAX или
  2. использует Node.js-подобные решения на стороне сервера, которые не используют много ресурсов для дополнительных запросов.
1 голос
/ 01 сентября 2011

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

Именно поэтому вы не хотите этого делать.Вам необходимо удалить этот сценарий и переместить updateUserTimestamp() в некоторый глобальный сценарий, который часто вызывается, в идеале в сценарий, в котором изменяется статус пользователя (поскольку, если статус пользователя не изменяется, его также не нужно обновлять).

0 голосов
/ 01 сентября 2011

Ваш код продолжает обновлять статус без каких-либо доказательств того, что пользователь все еще подключен или активен.Если пользователь просто выключит свой компьютер, он будет работать вечно, даже если сможет обнаружить закрытие соединения.(Выключенный компьютер не может закрыть соединение, не так ли?)

Вы должны заставлять пользователя делать что-то каждые 20 секунд, что вызывает обновление.Вы можете решить, что это за что-то, и это может быть что угодно.Но пользователь должен делать что-то, что заставляет вас считать его активным.Вы не можете просто считать его активным вечно, что и делает ваш код.

0 голосов
/ 01 сентября 2011

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

0 голосов
/ 01 сентября 2011

На каком сервере вы работаете? Этого не должно быть, потому что, когда пользователь закрывает браузер, он также должен завершить запрос AJAX и закрыть соединение TCP, а сервер должен принять это к сведению и завершить работающий процесс / поток PHP.

Попробуйте добавить window.onunload клиентское событие, которое убивает все активные запросы AJAX, и посмотрите, имеет ли это значение.

...