Алгоритм написания чата.... не пойму почему не работает :-/

MST

Новичок
Алгоритм написания чата.... не пойму почему не работает :-/

В общем сначала все как обычно, страница с авторизацией, далее, если пользователь прошел авторизацию, то скрипт выдает
пользователю "скелет" сайты в виде набора <frameset>
В каждый frame грузится свой блок html
а в центральный фрейм должен грузиться скрипт, который выводит 10 предыдущих сообщений, а далее новые сообщения.

Скелет этого скрипта такой:
<?php

flush();

$sth=mysql_db_query($mybase,"select * from `chat`;");
if (!$sth || mysql_num_rows($sth) == 0) { echo "Нет сообщений"; return; }

while ($ref=mysql_fetch_object($sth)) {
echo "$ref->mess<br>\n";
flush();
$last_id=$ref->id;
}#endwhile

flush();

while (1) {
$sth=mysql_db_query($mybase,"select * from `chat` where `id` > '$last_id';");
if ($sth && mysql_num_rows($sth) > 0) {
while ($ref=mysql_fetch_object($sth)) {
echo "$ref->mess<br>\n";
flush();
$last_id=$ref->id;
}#endwhile
}#endif
flush();
sleep(1);
}#endwhile

?>

$ref->mess - это сообщение пользователей, которые они пишут в чат.

Дык вот проблема в том, что весь frameset подвисает из-за этого скрипта... Видимо из-за того, что скрипт не отдает конечный хэндл.
Тоесть скрипт циклический, хоть и каждую секунду делает flush();

Как победить?

Раньше у меня это как-то работало. Только не пойму, может, другие настройки php.ini были, может мозгов больше было.
 

DvR

Новичок
А в каком случае последний while (1) { ... } должен был завершиться?
 

MST

Новичок
когда в таблице online в mysql не будет обнаружен SESSID пользователя.
 

MST

Новичок
да, конечно.... я здесь привел лишь скелет скрипта. в оригинале скрипт в несколько килобайт.

Дело не в этом, а втом, что браузер подвисает, когда начинает тянуть поток с этого скрипта. Может, я какие метатеги не поставил или еще чего?
 

cDLEON

Онанист РНРСlub
Из мануала:

Серверные модули для Apache, вроде mod_gzip, могут сами выполнять буферизацию, что не даст немедленной пересылки данных из функции flush() клиенту.

Даже браузер может буферизовать свой ввод до отображения. Netscape, например, буферизует текст, пока не получит end-of-line или начало тэга, и не будет отображать таблицы, пока не увидит тэга </table> самой внешней таблицы.

Некоторые версии Microsoft Internet Explorer начинают отображать страницу только после получения 256 байт вывода, поэтому вам может понадобиться отправить дополнительные пробелы перед очисткой, чтобы такие браузеры вывели страницу.
 

Фанат

oncle terrible
Команда форума
метатеги - это html.
почему бы тебе не сделать просто html страничку и не потренироваться на ней?
 

cDLEON

Онанист РНРСlub
Я думаю легче использовать Флешку, либо скрытый фрейм, для получения новых данных, после получения которых, скрипт заканчивает работу.
 

Фанат

oncle terrible
Команда форума
cDLEON
вот так и знал, что кто-то вылезет с этой идеей.

НУ ДАЙТЕ ВЫ ЧЕЛОВЕКУ НАПИСАТЬ ЧАТ ПО КЛАССИЧЕСКОЙ СХЕМЕ!

Учится он! Нельзя прыгать через ступеньки! Пусть напишет самый простой! Пусть поймёт, как чат вообще работает! А потом уже пишет флеши, фигеши и чёрта в ступе.

Он даже такую примитивную схему отладить не может! А как он будет флеш отлаживать?
 

MST

Новичок
Фанат
Дело в том, что у меня это работало ранее на другом сервере. Видимо, какие-то настройки у апача поменялись (или у php ?)
Вот я и ищу ответ.

Флеш - это, конечно, круто, но совсем другая тема.

Согласен с идеей про скрытый фрейм + JavaScript. Тоже красиво и менее заморочно.

-~{}~ 07.01.07 10:19:

cDLEON
mod_gzip в апаче не грузится
 

Popoff

popoff.donetsk.ua
весь frameset подвисает из-за этого скрипта
Видимо, у тебя где-то перед этим скриптом открывается сессия. Фреймы могут подвисать из-за того, что несколько скриптов с одним и тем же идентификатором сессии не могут выполняться одновременно. Об этом написано в мануале:
[m]session_write_close[/m]
 

MST

Новичок
Автор оригинала: Popoff
Видимо, у тебя где-то перед этим скриптом открывается сессия. Фреймы могут подвисать из-за того, что несколько скриптов с одним и тем же идентификатором сессии не могут выполняться одновременно. Об этом написано в мануале:
[m]session_write_close[/m]
Точно!!! У меня не правильно была оргнизована структура. У меня был один index.php файл, в котором в начале было прописано session_start();
И этот файл в разных фреймах запускался с разными параметрами. А во фрейме с сообщениями скрипт включался в режим stream, соответственно открывая сессию. Вот остальные скрипты и тормозились в процессе исполнения.

Спасибо!!! Спасибо всем!
 
Сверху