Я сделал чат-поле, как вещь в PHP. Единственная проблема заключается в том, что он не перезагружается автоматически. Есть ли способ сделать его перезагрузкой в PHP, или мне придется переместить все вокруг, чтобы я мог использовать AJAX? Кроме того, один из моих пользователей постоянно находится в сети. Я установил, что они находятся в автономном режиме, если они нажали клавишу или нажали за последние 3 минуты и отключили их, когда они покинули страницу. Они используют Firefox 9.0. Это из-за использования onunload? Каким будет решение?
Вы можете использовать тег meta refresh
, который может быть сгенерирован PHP, но это не очень специфичная для PHP функция.
<meta http-equiv="refresh" content="600">
Это обновит содержимое через 600 секунд. Вы могли бы более точно настроить время, основанное на требованиях ваших приложений.
Ajax, вероятно, является предпочтительным методом проверки неактивности пользователя. Вот аналогичный пост по проверке активности пользователя. Как определить с помощью JavaScript / jQuery, если пользователь в данный момент активен на странице?
ОБНОВИТЬ
Что касается второго вопроса о том, как обращаться с выходом пользователя в Firefox, то, как вы сказали, onunload
может быть непоследовательным. В этом случае использование ajax снова светит. Если ваше приложение перестает получать обновления от ajax от клиента, вы можете сделать какую-то очистку, чтобы пометить их как неактивные.
У нас была аналогичная ситуация в приложении ASP.Net MVC. В результате мы использовали Application Variables для хранения активности и состояния пользователей. Пример php можно найти здесь .
Надеюсь это поможет!
Вы можете добавить JavaScript для автоматического обновления всей страницы, но использование AJAX будет намного лучше для конечного пользователя.
способ, которым это делает Facebook, заключается в том, что клиент «Алиса» имеет ожидающий запрос на открытие новых сообщений около 1 минуты. если другой клиент «Боб» пишет Алисе сообщение, сервер может завершить ожидающий запрос Алисы. Затем Алиса получает новое сообщение и открывает новый ожидающий запрос.
вам нужно будет время ожидания ожидающих запросов примерно через минуту, или браузер сделает это. разные браузеры имеют разные настройки таймаута, поэтому просто используйте что-то маленькое. после таймаута вы открываете новый ожидающий запрос, чтобы ничего не пропустить.
У меня есть код для воспроизведения: listen.php (клиент вызывает это для создания ожидающего запроса, ожидая сообщения nr $ mnr события $ eid.
define('WAIT_MAX', 55); // wait max 55 sec define('WAIT_INT', 1); // wait 1 sec per call $start = time(); while ($start + WAIT_MAX > time()) { // check if an event occured $res = mysql_query('SELECT * FROM event WHERE `eid`="'.$eid.'" AND `mnr`="'.$mnr.'"'); if (mysql_num_rows($res) > 0) { // event occured $row = mysql_fetch_assoc($res); $msg = $row['msg']; echo "<event eid=\"$eid\" mnr=\"$mnr\" msg=\"$msg\" />\n"; die(); //die('event occured: '.$msg."<br>\nNext mnr=".($mnr+1)); //break; } else { // no event occured mysql_free_result($res); sleep(WAIT_INT); } } die(WAIT_MAX . ' seconds passed and no event occured.');
Боб отправляет свое сообщение yell.php, предоставляя $ msg
if (isset($_GET['msg'])) $msg = $_GET['msg']; else $msg = 'no message given, just firing the event.'; mysql_query('INSERT INTO `event` (`eid`, `mnr`, `msg`) VALUES ("'.$eid.'", "'.$mnr.'", "'.$msg.'")');
некоторые init.php, чтобы заставить его работать:
$eid = -1; $mnr = -1; if (isset($_GET['eid']) && isset($_GET['mnr'])) { $eid = max(0, (int)$_GET['eid']); $mnr = max(0, (int)$_GET['mnr']); } elseif (isset($_GET['eid'])) { $eid = max(0, (int)$_GET['eid']); $mnr = 1; } else die('no eid given');
использовать и изменять этот код по своему усмотрению.