Постоянная загрузка в чате

Долго я не мог найти ответ на вопрос о реализации постоянной загрузке страницы в чате, так же много раз натыкался на топики в форумах, где народ просто не знал почему же у них ничего не работает ! Сегодня я постараюсь ответить на все вопросы на конкретном примере…

При постоянной загрузке окна чата, необходимо использовать функцию flush(), которая выводит на экран буфер браузера. Например если у вас не до конца загрузилась таблица, то она не выведется в браузере, пока данные таблицы не будут получены до конца. Если вставить функцию flush() посередине этой таблички, то выведется та часть таблицы идущая до функции flush(), ну а позже когда данные таблицы загрузятся до конца (до тэга </table>), то на экран выведется остальная часть.

Так и в чате… Ваш скрипт вывода сообщений, «вечным» циклом сканирует базу на наличие новых сообщений, и если есть новые сообщения то выводит их — echo() и после этого вызывает функцию flush(), чтоб сообщения появились на экране.

Разберём конкретный пример:

<?php

// Эти две строки нужны чтоб вечный цикл не
обрывался
set_time_limit(0);
ignore_user_abort(true);
// Этот цикл выводит шапку. Если этого не делать, то первые
5-10 сообщений не будут сразу выводиться
for ($i = 0; $i < 20; $i++) {
echo "<!-- -->";
}
flush();
$last_mess = 0;
while (1 == 1) { // Вечный цикл
sleep(2);
$base = file("messages.dat");
if (count($base) > $last_mess) {// Если в базе есть новые строки
for ($i = $last_mess; $i < count($base); $i++) { // То циклом выводим их
echo $base[$i]."<br>n";
}
$last_mess = count($base);
flush();
}
}
?>

Теперь запустите этот скрипт в браузере, и откройте в блокноте файл messages.dat.
Дописывайте в файл по строке и сохраняйте файл, и вы увидите как в окне браузера дописываются строки !
Вот и постоянная загрузка готова 🙂

Косяки
1. Первые строки могли не выводиться если бы мы не выводили в начале файла шапку из символов (<!— —><!— —>…).
2. Если пример не работает, то скачайте с сайта http://www.apache.org/ Apache версии 2 ! У меня на Apache 1.3.23 под Windows ничего не работало 🙁