Перенесли сайт со старого сервера на новую конфигурацию. В результате, на сайте часть функционала перестала работать. Отказали все ajax-запросы.
В логах апача видим фатальные ошибки вида:
PHP Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers in /home/bitrix/ext_www/site.ru/bitrix/modules/main/lib/data/cache.php
Начали разбираться в коде, не отрабатывал вывод после подключения:
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Далее перешли в файл /bitrix/modules/main/include/prolog_before.php, вывод остановился на коде:
CMain::PrologActions();
Ищем метод PrologActions в файл \bitrix\modules\main\classes\general\main.php вывод остановился на коде:
ob_start(array(&$APPLICATION, "EndBufferContent"));
Делаем вывод, что проблема с буферизацией, скорее всего, ob_start где-то ранее используется. В нашем случае так оно и было, в init.php подключался файл, где использовался $cache->StartDataCache, который использует буферизацию (ob_start и ob_end_clean).
Но в обработчике OnEndBufferContent нельзя использовать буферизацию, поэтому выдаются ошибки типа:
PHP Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers
PHP Fatal error: ob_end_flush(): Cannot use output buffering in output buffering display handlers
Это влияет на задания крона, ajax-запросы т.к. приводят к фатальной ошибке.
Теги: PHP Fatal error ob_start(), prolog_before.php, ob_start, проблема с буферизацией