Несовместимость iframe + session_start + flush

ChesterOne

Guest
Несовместимость iframe + session_start + flush

Думал я на досуге чат написать. Для начала простой. С использованием поточного HTML (бесконечная загрузка страницы). Код в упрощенном варианте следующий.
PHP:
<?php
session_start();
}
?>
<body>
<iframe src="./chat.php" width="100" height="100"></iframe>

<?php
while (true) {
	echo str_pad('Hello',4096)." ";    
	flush();
	set_time_limit(30);
	sleep(2);
}
?>
</body>
</html>
При загрузке такой страницы все идет нормально, только фрейм не грузица. Остаеца белым.
Хотя стоит убрать одну из сотовляющих:
1) Либо убрать session_start();
2) Либо фрейм со страницы
3) Либо убрать бесконечный цикл
все начинает работать нормально. Я так и не понял в чем дело. Может сессия что то делает с буфферизацией?
Спасибо
 

SiMM

Новичок
> Может сессия что то делает с буфферизацией?
Делает. Иначе как бы переписывались URL'ы?
 

Z.O.S.

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

ChesterOne

Guest
Завершение сессии не помогает. В общем если на основной странице или во фрейме есть строка
PHP:
session_start();
то загрузка никогда не завершается.
Пришлось отказатся от использования встроенных сессий и писать свои.

У меня еще проблема. Когда пользователь сидит в чате, бесконечный цикл обновляет число в таблице БД. По этому числу можно определить пользователей покинувших чат.
Но эксперимент показал, что при закрытии окна PHP скрипт продолжает выполнятся на сервере и обновлять контрольное число. Незнаю что и делать.
Есть у кого-нить идеи насчет того, как проследить присутствие пользователя в чате?

-~{}~ 24.08.05 17:36:

Конечно, можно было бы сделать через авторефреш, но мне хотелось бы все таки через бесконечную загрузку страницы.
 

vitus

мимо проходил
[q]
Завершение сессии не помогает. В общем если на основной странице или во фрейме есть строка

session_start();

то загрузка никогда не завершается.
[/q]

пиши:

session_start();
session_write_close();

while(true){
//bla bla bla
}

и убей куку в браузере !
 

ChesterOne

Guest
SiMM
Попробовал. Процесс php все равно висит :(
PHP:
ignore_user_abort(0);
register_shutdown_function("exit");
Ничего не помогает. :(

vitus
Да, спасибо помогло. А можно поподробнее, почему такое произходит? Может сессия отсылает какой то заголовок, который меняет поведение браузера?
 

vitus

мимо проходил
убей куку в браузере !

abort происходит по таймауту - не сразу

- судя по всему :)

-~{}~ 24.08.05 15:49:

сессия лочит свой файл и не позволяет его повторно открывать
 

ChesterOne

Guest
vitus
Насчет таймаута:
Незнаю, уже минут 5 или 10 как закрыл браузер, открываю таблицу БД а там счетчик все обновляеца. Хотя в скрипте написано
PHP:
set_time_limit(30);
 

ChesterOne

Guest
vitus
Пошутил :)
Но я видел, такой чат есть. И работает. Должно же быть какое то решение :(
 

vitus

мимо проходил
и каждый раз вызывая set_time_limit(30);
ты делаешь его бесконечным

http://php.rinet.ru/manual/en/function.set-time-limit.php

-~{}~ 24.08.05 16:04:

вообще тайм лимит и таймаут - штуки разные, я не знаю как узнать soTimeOut коннекта апача из пхп

-~{}~ 24.08.05 16:06:

sleep в тайм лимите не считается
- не шутка
 

ChesterOne

Guest
Но мне и надо чтобы он был бесконечным. Просто надо чтобы он отключался при отсоединении клиента (читай браузера).

-~{}~ 24.08.05 19:11:

2 секунды роли не играют. И ими можно пренебречь, а ты сделал на них акцент. Как бы в шутку.
 

vitus

мимо проходил
set_time_limit(0);

ignore_user_abort(1);

while(!connection_aborted()){

}

кароче читайте маны полностью
и всёравно connection_aborted() наступит по таймауту сокета

-~{}~ 24.08.05 16:17:

2 секунды роли не играют. И ими можно пренебречь
пришла твоя пора шутить :)
 

ChesterOne

Guest
Признаю, я не читал ман полностью, а лишь пробежался.
Как я понял, при ignore_user_abort(0); скрипт завершаеца при отсоединении пользователя. Это мне и нужно. Но этого не произходит.
Попробовал твою конструкцию. Не помогает.
Ладно, мне пора. Спасибо всем. Буду завтра утром :)
 

ChesterOne

Guest
connection_aborted() наступит по таймауту сокета
Я так и понял. Но что то уж таймаут больно большой. Через 10 минут заглядываю в таблицу: запись обновляется каждые 2 секунды.
Ладно, если вы мне не верите, создате скрипт:
PHP:
ignore_user_abort(1);
while(!connection_aborted()){
	$file = fopen("./test/".time(), "w");
	fclose($file);
	set_time_limit(10);
	sleep(1);
}
Создайте рядом директорию "test". И запустите скрипт. Через какое то время можете нажать стоп и/или закрыть браузер. Ждите сколько угодно, скрипт будет работать и создавать файлы пока вы в ручную не завершите процесс. И через полторы минуты и через 10, что уже не приемлимо для чата.
 

vitus

мимо проходил
- это оттого что твой скрипт сокет не пинает и не пытается туда писать, если бы пытался - тогдабы и таймаут отлавливал, а так - не может

и перестань обнулять таймер в цикле,
читай маны полностью :)
 

ChesterOne

Guest
vitus
О круто, изменил код:
PHP:
set_time_limit(0);
ignore_user_abort(1);
while(!connection_aborted()){
	$file = fopen("./test/".time(), "w");
	fclose($file);
	echo str_pad(time().'<br>',4096)."\n";
	flush();
	sleep(1);
}
Скрипт сразу поумнел :)

У меня еще вопрос. Я добавил еще пару строк после цикла. Но они не срабатывают.
PHP:
$file = fopen("./test/STOP_".time(), "w");
fclose($file);
Почему при отсоединении клиента, последний файл не создается? По логике должен был.
 
Сверху