Istamendil
Новичок
Странности с буферизацией, сжатием страниц, своим обработчиком оишбок, редекларацией
Проблема заключается в странном (на мой взгляд) поведении буферизационного механизма...
У меня есть класс, в конструторе которого начинается буферизация вывода с GZIP. В деструкторе прописан ob_end_flush(). Всё это работает нормально, если я сам вызываю деструктор в конце скрипта... Иначе, если он мной самим не вызван пхп выводит, что нет буфера (ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush. in...) ... Я вывел, что это происходит , если вывести сторку перед началом буферизации (
)... Не совсем понимаю почему...
Но тут есть гораздо более интеречный момент (опять же на мой взгляд).
Я перед созданием обьекта вышеупомянутого класса (с буферизацией) я регистрирую свой обработчик ошибок, в котором (в функции) обьявлена внутренняя функция, у меня выводится ошибка о редекларации этой внутренней функции! Причём пишет, что она была объявлена в том же файле и в той же строке и ничего не пишут про функцию обработчика оишбок... Я пробовал переименовывать внутреннюю функцию. Это "прекратилось" только после выключения GZIP сжатия в вышеупомянутом классе. И опять таки если перед созданием обьекта у меня был вывод строки... Без него, как и без GZIP, всё идёт нормально. Видел похожую проблему (там другое направление, но также зависимоть и от сжатия) : http://phpclub.ru/talk/forumdisplay.php?forumid=12.
Дополнительная инфа:
- Денвер (Apache 1.3, PHP 5.04)
- Ошибка с редекларацией возникает только если обьявить функцию с "редекларированными" функциями как обработчик ошибок
З.ы. Можно было бы и забить - не выводить никаких строк перед буферизацией (в смысле их и не надо выводить), но с причинами проблемами хочется разобраться и предусмотреть всякие экстренные случаи.
Проблема заключается в странном (на мой взгляд) поведении буферизационного механизма...
У меня есть класс, в конструторе которого начинается буферизация вывода с GZIP. В деструкторе прописан ob_end_flush(). Всё это работает нормально, если я сам вызываю деструктор в конце скрипта... Иначе, если он мной самим не вызван пхп выводит, что нет буфера (ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush. in...) ... Я вывел, что это происходит , если вывести сторку перед началом буферизации (
PHP:
echo 'бла-бла'; $page=new output();
Но тут есть гораздо более интеречный момент (опять же на мой взгляд).
Я перед созданием обьекта вышеупомянутого класса (с буферизацией) я регистрирую свой обработчик ошибок, в котором (в функции) обьявлена внутренняя функция, у меня выводится ошибка о редекларации этой внутренней функции! Причём пишет, что она была объявлена в том же файле и в той же строке и ничего не пишут про функцию обработчика оишбок... Я пробовал переименовывать внутреннюю функцию. Это "прекратилось" только после выключения GZIP сжатия в вышеупомянутом классе. И опять таки если перед созданием обьекта у меня был вывод строки... Без него, как и без GZIP, всё идёт нормально. Видел похожую проблему (там другое направление, но также зависимоть и от сжатия) : http://phpclub.ru/talk/forumdisplay.php?forumid=12.
Дополнительная инфа:
- Денвер (Apache 1.3, PHP 5.04)
- Ошибка с редекларацией возникает только если обьявить функцию с "редекларированными" функциями как обработчик ошибок
З.ы. Можно было бы и забить - не выводить никаких строк перед буферизацией (в смысле их и не надо выводить), но с причинами проблемами хочется разобраться и предусмотреть всякие экстренные случаи.