Вопрос или проблема
У меня есть небольшой PHP, который я вызываю из URL jqGrid, который я использую внутри плагина WordPress для администратора:
require_once($_SERVER['DOCUMENT_ROOT'] . '/xDl21my20/wp-load.php');
remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
add_action( 'shutdown', function() {
while ( @ob_end_flush() );
} );
global $wpdb;
ob_start();
$sql_select = "SELECT * FRON TABLE ORDER BY ID ASC";
$results = $wpdb->get_results($sql_select, OBJECT);
return json_encode($results);
ob_get_clean();
но я вижу, что не получаю никаких результатов, и в логе вижу эту ошибку:
[02-Jan-2022 09:05:32 UTC] PHP Notice: ob_end_flush(): failed to send buffer of zlib output compression (0) in /home/..../wp-includes/functions.php on line 5107
Итак, поскольку я добавил этот remove_action, как читал в других вопросах, он должен был обойти проблему ob_end_flush, но не обошел… Может быть, я что-то забыл, или это может быть связано с установленной версией PHP PHP Version 7.4.27?… Любое направление было бы оценено… спасибо!!!
Кстати, zlib_compression включен в php.ini
Нашел решение проблемы: использование “return” было неправильным способом… нужно использовать “echo” таким образом, потому что это не функция, а простой PHP, возвращающий объект. Еще раз спасибо всем.
Ответ или решение
Вопрос об ошибке ob_end_flush(): failed to send buffer of zlib output compression (0)
в PHP часто встречается, особенно при использовании WordPress и сжатием выходных данных через zlib. Давайте рассмотрим возможные причины и способы решения этой проблемы.
Теория:
Функция ob_end_flush()
завершает буферизацию любого контента, который на данный момент находится в буфере, и отправляет его клиенту. Если zlib компрессия включена в php.ini (через zlib.output_compression = On
), это может приводить к конфликтам при попытке очистки буфера вручную, поскольку zlib уже обрабатывает выходные данные.
В вашем случае, ошибка может возникнуть из-за следующих факторов:
- Конфликт zlib-сжатия: Когда zlib компрессия включена, управление буферизацией данных может стать ошибочной, особенно если WordPress пытается выполнить свои собственные действия по очистке буфера.
- Необходимость используя echo вместо return: Жизненный цикл скрипта PHP может потребовать выполнение определенных заданий, прежде чем вернуть данные, включая отправку заголовков и флаша (flush) выходного буфера.
- Версия PHP: PHP 7.4.27 — это стабильная версия, однако всегда возможны некоторые специфичные ошибки или конфликты в зависимостях, особенно при использовании старых версий библиотеки или плагинов.
Пример:
Ваш пример кода демонстрирует использование функций ob_start()
, ob_end_flush()
, и попытку завершить все буфера с помощью while ( @ob_end_flush() );
. Это может конфликтовать с включённой zlib компрессией.
Применение:
Для решения проблемы, рассмотрите следующие шаги:
-
Изменение логики вывода: Вместо использования
return
, используйтеecho
для вывода JSON данных. Это позволяет обрабатывать вывод более корректно без участия системы буферизации.echo json_encode($results);
-
Отключение zlib или обёртка в обрабочик ошибок: Вы можете временно отключить zlib в php.ini и проверить, изменится ли поведение:
zlib.output_compression = Off
-
Изменение кода управления буферами: Иногда достаточно лишь корректно завершить буферизацию:
ob_start(); echo json_encode($results); $output = ob_get_clean(); // Возможно, отправить результат ручным флашем echo $output;
Эти шаги могут помочь в решении проблемы, избегая конфликтов между встроенными механизмами WordPress и настроенной средой PHP. Если после этого ошибка не исправляется, рассмотрите обновление инфраструктуры или сохраняйте промежуточные шаги в лог для дальнейшего анализа.