Столкнулся с похожей проблемой и долго не мог найти причину, вариант [URL=https://dev.1c-bitrix.ru/support/forum/messages/forum6/topic107279/message554087/#message554087]https://dev.1c-bitrix.ru/support/forum/messages/forum6/topic107279/message554087/#message554087[/URL] не помог, ошибка просто пропадает.
Напишу сюда, для истории, потому что пока искал решение часто находил эту ветку, поэтому может кто-то также найдет эту информацию здесь.
Как выглядит внешне ошибка: страница открывается пустой или выводится сообщение об ошибке:
[CODE]Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers in \bitrix\modules\main\lib\data\cache.php on line 392
[/CODE]
Либо может быть такая ошибка:[CODE]Warning: Cannot modify header information - headers already sent[/CODE]
Максимально просто повторить ситуацию можно создав отдельный файл (что-то подобное было у меня)[CODE]<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
Bitrix\Main\EventManager::getInstance()
->addEventHandler('main', 'OnEndBufferContent', function(&$buffer) {
$cache = Bitrix\Main\Data\Cache::createInstance();
if ($cache->startDataCache(3600, rand(1000, 9999))) {
$cacheValue = 'world';
$cache->endDataCache($cacheValue);
} else {
$cacheValue = $cache->getVars();
}
$buffer = str_replace('{cache}', $cacheValue, $buffer);
});
echo 'Hello {cache}!';
[/CODE]
Т.е. вот такой код не будет работать, задача, которая решается здесь, реальная и звучит так "Нужно во всем тексте страницы подменить {cache} на какую-то строку, которая берется из базы и это значение нужно закешировать".
Что обязательно для повторения ошибки:
- Должен быть подключен prolog_before.php, а не header и footer (т.е это ajax или cron обычно).
- Кеш должен отсутствовать, т.е. должнен производиться процесс его сохранения (я в примере сделал случайный cacheId, чтобы наверняка это выполнялось).
Решение:
- Отказаться от кеширования внутри OnEndBufferContent.
- Заранее подготавливать кеш (вариант с OnBeforeEndBufferContent не сработает).
- Внутри OnEndBufferContent проверять константу BX_BUFFER_SHUTDOWN, и если она есть, то пытаться получать данные из кеша через initCache и getVars, т.к. они не вызывают ошибку (т.е. просто не сохранять данные, но получить попробовать можно).
Напишу сюда, для истории, потому что пока искал решение часто находил эту ветку, поэтому может кто-то также найдет эту информацию здесь.
Как выглядит внешне ошибка: страница открывается пустой или выводится сообщение об ошибке:
[CODE]Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers in \bitrix\modules\main\lib\data\cache.php on line 392
[/CODE]
Либо может быть такая ошибка:[CODE]Warning: Cannot modify header information - headers already sent[/CODE]
Максимально просто повторить ситуацию можно создав отдельный файл (что-то подобное было у меня)[CODE]<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
Bitrix\Main\EventManager::getInstance()
->addEventHandler('main', 'OnEndBufferContent', function(&$buffer) {
$cache = Bitrix\Main\Data\Cache::createInstance();
if ($cache->startDataCache(3600, rand(1000, 9999))) {
$cacheValue = 'world';
$cache->endDataCache($cacheValue);
} else {
$cacheValue = $cache->getVars();
}
$buffer = str_replace('{cache}', $cacheValue, $buffer);
});
echo 'Hello {cache}!';
[/CODE]
Т.е. вот такой код не будет работать, задача, которая решается здесь, реальная и звучит так "Нужно во всем тексте страницы подменить {cache} на какую-то строку, которая берется из базы и это значение нужно закешировать".
Что обязательно для повторения ошибки:
- Должен быть подключен prolog_before.php, а не header и footer (т.е это ajax или cron обычно).
- Кеш должен отсутствовать, т.е. должнен производиться процесс его сохранения (я в примере сделал случайный cacheId, чтобы наверняка это выполнялось).
Решение:
- Отказаться от кеширования внутри OnEndBufferContent.
- Заранее подготавливать кеш (вариант с OnBeforeEndBufferContent не сработает).
- Внутри OnEndBufferContent проверять константу BX_BUFFER_SHUTDOWN, и если она есть, то пытаться получать данные из кеша через initCache и getVars, т.к. они не вызывают ошибку (т.е. просто не сохранять данные, но получить попробовать можно).