Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

виснет Apache при обновлении формы редактирования элемента инфоблока

00 голосов
3
Недавно возникла проблема при работе с сайтом - виснет apache во время обновления формы редактирования элемента. Форма редактирования элемента инфоблока - любая, хоть стандартная, хоть своя - проблема наблюдается везде. При этом виснет не на собственно заходе, а именно на обновлении.

Допустим, захожу на форму по адресу /bitrix/admin/iblock_element_edit.php?WF=Y&ID=408&type=structure&lang=ru&IBLOCK_ID=51&find_section_section=-1 - форма загружается нормально. Если сделать обновление страницы в браузере - виснет. Но если запросить тот же адрес (выделить адрес в строке браузера и нажать enter), то всё нормально. Дело в том, что при заходе на адрес запрашивается только сам документ, а все файлы грузятся из кэша браузера. При обновлении страницы запрашиваются все файлы страницы (скрипты, css, картинки) с сервера, но так как они не изменены, отдаются с HTTP-статусом 304 (Not Modified). Но именно когда браузер делает такой запрос виснет apache, загружая одно ядро на 100%.

Проблема наблюдается только на формах редактирования элемента инфоблока, на других страницах админки и публичной части не наблюдается, в логах нет ни ошибок, ни чего-то аномального. Вот пример кусков логов:

Ответ сервера при переходе на страницу:
Код
127.0.0.1 - - [08/Jan/2009:11:37:39 +0300] "GET /bitrix/admin/iblock_element_edit.php?WF=Y&ID=377&type=info&lang=ru&IBLOCK_ID=4&find_section_section=-1 HTTP/1.1" 200 16664
127.0.0.1 - - [08/Jan/2009:11:37:40 +0300] "GET /bitrix/admin/fileman_common_js.php?s=ems_7.1.230347 HTTP/1.1" 200 69204

Ответ сервера при обновлении страницы с формой (сокращенный вариант):
Код
127.0.0.1 - - [08/Jan/2009:11:38:22 +0300] "GET /bitrix/admin/iblock_element_edit.php?WF=Y&ID=377&type=info&lang=ru&IBLOCK_ID=4&find_section_section=-1 HTTP/1.1" 200 16662
127.0.0.1 - - [08/Jan/2009:11:38:22 +0300] "GET /bitrix/themes/.default/compatible.css HTTP/1.1" 304 -
127.0.0.1 - - [08/Jan/2009:11:38:22 +0300] "GET /bitrix/themes/.default/iblock.css?1216052244 HTTP/1.1" 304 -
127.0.0.1 - - [08/Jan/2009:11:38:22 +0300] "GET /bitrix/themes/.default/adminstyles.css?1221576968 HTTP/1.1" 304 -
127.0.0.1 - - [08/Jan/2009:11:38:22 +0300] "GET /bitrix/themes/.default/catalog.css?1216052197 
~~~~~~~~~~~~~~~~~~~~~~~ вырезано ~~~~~~~~~~~~~~~~~~~~~~~
HTTP/1.1" 304 -
127.0.0.1 - - [08/Jan/2009:11:38:23 +0300] "GET /bitrix/themes/.default/images/toolbar/br.gif HTTP/1.1" 304 -
127.0.0.1 - - [08/Jan/2009:11:38:23 +0300] "GET /bitrix/themes/.default/calendar.css?undefined HTTP/1.1" 304 -

Браузер на обновлении показывает часть страницы админки, но без формы и начинает ждать. Тем временем apache трудится на 100% и не слетает по таймауту - помогает только его убийство.
спросил 28 Фев, 14 от bazzet (620 баллов)

3 Ответы

00 голосов
Какая-то непонятная фигня. Проблема в параметре PHP: zlib.output_compression = On . При установке в Off стало всё ок. Использовал данную фичу вместо модуля компрессии.
ответил 05 Авг, 14 от bazzet (620 баллов)
00 голосов
Битрикс версии 10.0.3. Зависания у меня проявлялись при открытии окна визуального редактирования страницы.
Виснет на открытии страницы:
http://site.ru/bitrix/admin/public_file_edit.php?lang=ru&path=%2Findex.php&site=s1
На Firefox тоже виснет. В Битрикс версии 8.5.2 данной проблемы нет.
Чтобы устранить глюк необходимо выполнить реинжениринг страницы:
http://site.ru/bitrix/admin/public_file_edit.php?lang=ru&path=%2Findex.php&site=s1
уточняю место сбоя: http://site.ru/bitrix/admin/fileman_js.php?lang=ru&v=1303299644
после отключения fileman_js.php, виз.редактор не открывается и зависает:
http://site.ru/bitrix/admin/fileman_common_js.php?s=c2s_10.0.4
после отключения fileman_common_js.php, не зависает, но виз.редактор не открывается.
уточняю место сбоя: while(ob_get_level()) ob_end_clean();
после отключения while(ob_get_level()) ob_end_clean(); в обоих файлах - не зависает, виз.редактор открывается.
Решение по зависанию виз.редактора: цикл while(ob_get_level()) ob_end_clean(); перестаёт зависать если в .htaccess отключить php_flag zlib.output_compression On.
Дело в том, что ob_get_... - это функции PHP и Master Value: zlib.output_compression = Off. Без zlib.output_compression сайт успешно проверяется Битриксом. Откуда взялось On - я сам включил zlib когда решал вопрос компрессии сайта для увеличения производительности.
Офиц.документация Битрикс: "Сжатие контента можно осуществлять непосредственно веб-сервером В частности для Apache есть модули mod_gzip и mod_deflate. Также компрессию возможно реализовать на стороне PHP включением директивы zlib.output_compression=1."
http://www.php.net/manual/ru/function.ob-end-flush.php#103387:
If you enable zlib.output_compression then level count will be increased by 1 and then this code:
<?php while (ob_get_level()) { ob_end_clean(); } ?>
will just freeze your script.
Если вывести ошибку функции ob_end_clean() при вкл. zlib, то она будет такой: Notice: ob_end_clean()

[ref.outcontrol]: failed to delete buffer zlib output compression in ....php on line ...
Нельзя сбросить буфер функцией ob_end_clean, если буферизация включена определенным образом (в данном случае из конфига). Соответственно ob_get_level() никогда не принимает нулевое значение, что означает бесконечный цикл.
PHP оборачивает всё в ещё один буфер, который потом gzip-ит при этом ob_get_level будет больше не единичку изначально. Его закрыть нельзя самостоятельно и получается бесконечный цикл.
(не решение - зависает)Решение для использования zlib:
while (ob_get_level()) // the following manual level counting is to deal with zlib.output_compression set to On
for($level=ob_get_level();$level>0;--$level) @ob_end_clean();

Решение для использования zlib:
while(ob_get_level()-1) ob_end_clean();
На отладку решения с zlib нет времени, по этому отказываюсь от zlib и взамен его включаю mod_deflate:
a2enmod deflate; /etc/init.d/apache2 restart
Проверка: При вкл.: Duration: 577 ms, Content-Encoding: gzip. При выкл.: Duration: 1340 ms, Content-Encoding отсутствует.
Информация: http://sysoev.ru/mod_deflate/ mod_deflate работает на большинстве серверов Рамблера, а также на yandex.ru и mail.ru.
ответил 08 Дек, 14 от Berry (160 баллов)
00 голосов
Текущая версия - 11-я.
ответил 31 Март, 15 от Pomnep (13,960 баллов)

Похожие вопросы

0 голосов
7 ответов
0 голосов
9 ответов
0 голосов
3 ответов
спросил 14 Фев, 14 от Ursa (260 баллов)
0 голосов
4 ответов
спросил 07 Фев, 14 от Zaika03 (100 баллов)