ob_end_flush(): не удалось отправить буфер сжатия вывода zlib (0) в внешнем php

Вопрос или проблема

У меня есть небольшой 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 уже обрабатывает выходные данные.

В вашем случае, ошибка может возникнуть из-за следующих факторов:

  1. Конфликт zlib-сжатия: Когда zlib компрессия включена, управление буферизацией данных может стать ошибочной, особенно если WordPress пытается выполнить свои собственные действия по очистке буфера.
  2. Необходимость используя echo вместо return: Жизненный цикл скрипта PHP может потребовать выполнение определенных заданий, прежде чем вернуть данные, включая отправку заголовков и флаша (flush) выходного буфера.
  3. Версия PHP: PHP 7.4.27 — это стабильная версия, однако всегда возможны некоторые специфичные ошибки или конфликты в зависимостях, особенно при использовании старых версий библиотеки или плагинов.

Пример:

Ваш пример кода демонстрирует использование функций ob_start(), ob_end_flush(), и попытку завершить все буфера с помощью while ( @ob_end_flush() );. Это может конфликтовать с включённой zlib компрессией.

Применение:

Для решения проблемы, рассмотрите следующие шаги:

  1. Изменение логики вывода: Вместо использования return, используйте echo для вывода JSON данных. Это позволяет обрабатывать вывод более корректно без участия системы буферизации.

    echo json_encode($results);
  2. Отключение zlib или обёртка в обрабочик ошибок: Вы можете временно отключить zlib в php.ini и проверить, изменится ли поведение:

    zlib.output_compression = Off
  3. Изменение кода управления буферами: Иногда достаточно лишь корректно завершить буферизацию:

    ob_start();
    echo json_encode($results);
    $output = ob_get_clean();
    // Возможно, отправить результат ручным флашем
    echo $output;

Эти шаги могут помочь в решении проблемы, избегая конфликтов между встроенными механизмами WordPress и настроенной средой PHP. Если после этого ошибка не исправляется, рассмотрите обновление инфраструктуры или сохраняйте промежуточные шаги в лог для дальнейшего анализа.

Оцените материал
Добавить комментарий

Капча загружается...