Flush, Sleep + Проблема

Varg

Guest
Flush, Sleep + Проблема

Суть: чат, с flush, sleep и "вечным" циклом. (знаю что ресурсоёмко, но пока так). И вот проблема: на локалхосте (вин98, апач, пхп 4,1) всё работает. Вообще всё. Но в сети (сервер *nix) при показе страницы фрэймов возникает проблема - при обращении к окну дискуссии выводит предыдущие фразы и на куске кода с вечным циклом все прочие фрэймы стопятся, дожидаясь (вечно) пока догрузится дискуссия. Причём дискуссия работает как положено (напрямую пихал в базу сообщения через тестовый скрипт). Пытался делать редирект, собирая значения фрэймов в родительский, и только при загрузке всех фрэймов редиректить на дискуссию, тогда работает - все фрэймы прогружаются, но опять всё виснет и нельзя ни отправить сообщение, ни обновить юзер-лист... Вот в общем как. Есть какие идеи?
И шапка в 1К не помогает (логично) и вообще не понятно. Safe mode отключен. SetTimeLimit = 0.

Кому интересен код - ask.
 

.des.

Поставил пиво кому надо ;-)
в php.ini
output_buffering=0
или
ini_set("output_buffering","0");
должно помочь.
 

Varg

Guest
Спасибо :) . Сейчас попробую. А можно теории немного? Из-за чего? (и почему на локале работало?) :)
 

.des.

Поставил пиво кому надо ;-)
Here is a short explanation of the configuration directives.


output_buffering boolean/integer
You can enable output buffering for all files by setting this directive to 'On'. If you wish to limit the size of the buffer to a certain size - you can use a maximum number of bytes instead of 'On', as a value for this directive (e.g., output_buffering=4096).

output_handler string
You can redirect all of the output of your scripts to a function. For example, if you set output_handler to mb_output_handler(), character encoding will be transparently converted to the specified encoding. Setting any output handler automatically turns on output buffering.

Note: You cannot use both mb_output_handler() with ob_inconv_handler() and you cannot use both ob_gzhandler() and zlib.output_compression.

implicit_flush boolean
FALSE by default. Changing this to TRUE tells PHP to tell the output layer to flush itself automatically after every output block. This is equivalent to calling the PHP function flush() after each and every call to print() or echo() and each and every HTML block.

When using PHP within an web environment, turning this option on has serious performance implications and is generally recommended for debugging purposes only. This value defaults to TRUE when operating under the CLI SAPI.
 

Varg

Guest
Хм.... Не помогло :( Всё то же всё там же. Есть ещё какие нибудь идеи?
 

Varg

Guest
А он и из текущего местоположения у меня не работает
 

Varg

Guest
А на моём сервере работает. Каждую секунду, как и надо.
 

.des.

Поставил пиво кому надо ;-)
тогда приводи код (только пожалуйста не надо весь.)
и еще раз поясни.. у тебя фреймовая структура - дискуссия (=окно чата) грузится первой - а все остальные ждут пока догрузится и соответственно висят, так?
 

Varg

Guest
Наоборот. Там счётчик (хотя это не помогло и посему не столь важно) который считает число загр. фрэймов, и когда все загрузились, редиректит на саму дискуссию.

PHP:
while ($Exit != 1) {
 // mysql query here
 while ($A = mysql_fetch_array($res,MYSQL_ASSOC)) {
  // formatting
  ShowLine($A);
  flush();
 }
@mysql_freeresult($res);
sleep(2); set_time_limit(20);
}
 

Varg

Guest
До первого while вываливаются старые сообщения :) тоже с flush()
 

.des.

Поставил пиво кому надо ;-)
Это ты привел упрощенный код дискуссии?
ты специально ограничение по времени 20 секунд поставил?
Ты сказал что ДиМин пример с flush у тебя работает и это тоже работает если просто вывести отдельный фрейм.
Покажи как и что ты делаешь когда ПЕРЕСТАЕТ работать. что значит ни отправить сообщения, ничего?

К слову нет функции mysql_freeresult, есть mysql_free_result
 

Varg

Guest
Я вырезал переменные сессии, отвечающие за id последнего возвращённого сообщения. А так код полный. Могу более полно привести :)
В теории я вижу, что это должно работать, но вот не работает. И при загрузке фрэйма дискуссии все прочие фрэймы при попытке загрузки висят белыми (бг) и ждут дискуссию.
Насчёт ни отправить сообщения - это оказалось не правдой.
Если в поле ввода писать текст и отправлять - в базу он его записывает. Но не выводит.
 

.des.

Поставил пиво кому надо ;-)
так подожди.. он хоть что то выводит?
ссылка в инете есть?
 

Varg

Guest
Ограничение поставил специально, но и без него оно не работало. И с ним тоже :)
 

Varg

Guest
Я дам ссылку, и меня обвинят в рекламе :)
Да и защита там пока не полностью прописана, а тут умельцы есть всякие :) Хотя для них она будет (надеюсь) не по зубам. Я тебе приватно сейчас линк скину.
 

Varg

Guest
Он выводит то, что было написано при полном рефреше, уже как старые сообщения. А при вечном цикле не выводит. Вот.
 

Varg

Guest
.des. Может в асю стукнешся? 43764321 А то похоже на флуд уже :) А результат (если таковой будет, я сюда отпишу)
 

Varg

Guest
Отлично. Методом исключения выяснилось, что проблема решается тем, что надо отключить инклюд на файл, с пятью строками:
unset($X);

session_module_name("files");
session_save_path("/tmp/sess");
session_start();
session_register("X");

И теперь интересно, как это я без них буду чат то делать. И как это вообще связано с flush()... Мрачно.
 

Varg

Guest
Причём если исключить строку session_save_path(); то обновляется нормально :) Но и данные сессии не доступны :(

Директория за пределами www, и сессии работают нормально. Можно ли как нибудь получить данные сессии без её инициализации? Имея доступ к файлу сессии и SID ?
 
Сверху