error_log, залитый сообщениями "charset не поддерживается, предполагая, что utf-8" - PullRequest
0 голосов
/ 07 декабря 2018

Проблема: Журнал ошибок блога Wordpress заполняется сообщениями «charset not поддерживается, при условии, что сообщения utf-8»;Увеличивается на 0 байт до 450 Мб за 24 часа (~ 28 тыс. просмотров страниц, если статистика верна).

Подробности: У меня есть блог на WordPress, размещенный на учетной записи общего хостинга.Он работал годами, и это никогда не было проблемой, пока не так давно, но я не могу точно определить точные временные рамки, когда это начало происходить.Несколько месяцев назад я начал превышать разрешенные ресурсы (в основном память), поэтому они переместили меня на другой сервер, и мне пришлось обновить учетную запись для более высокого использования разрешенных ресурсов.Старый сервер работал под управлением php5, а этот - под php7.Последние WP + около 15 популярных плагинов, все соответствующие версии.Тема древняя, она была там с самого начала.

Вчера я удалил журнал ошибок 9 ГБ (!) В корне сайта, сегодня, 24 часа спустя, его 500 МБ.Все строки похожи:

[datetime] PHP Warning:  html_entity_decode(): charset `keep-ali0' not supported, assuming utf-8 in /home/accountname/public_html/wp-includes/formatting.php on line 5124
[datetime] PHP Warning:  htmlentities(): charset `/[^0-9\.]/' not supported, assuming utf-8 in /home/accountname/public_html/wp-content/plugins/wp-super-cache/wp-cache-base.php on line 5
... etc.

Я проанализировал старый журнал размером 2 ГБ:

  • они пришли из 13 файлов: 3 основных файла WP, другие из 6 различных плагинов
  • только из этих функций: htmlentities(), htmlspecialchars(), html_entity_decode()
  • более 1000 уникальных "кодировок": все это мусор, большинство включает непечатаемые символы, другие просто странные вещи: пути (не мое!), регулярные выражения, целые числа, шестнадцатеричные значения ...: #^[a-z]:[/\\]#i, meta_value, 0x7fe858ae2920, /home/someone-elses-account-name/public_html/includes/functions.php, ...

Откуда эти значения?

С чего начать устранение неполадок?


Редактировать: Решение

Ниже приведен отличный ответ с объяснением того, почему это происходит.К сожалению, находясь на виртуальном хостинге и используя сторонние приложения, я не мог найти обходных путей.Но после разговора с нашим хостинг-провайдером они добавили internal_encoding utf-8 в конфигурацию веб-сервера Apache через include config (что-то в этом роде).И это сработало.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Похоже, что это известная ошибка в PHP, которую трудно воспроизвести, поэтому она застревает некоторое время.

https://bugs.php.net/bug.php?id=71876

Были предложены различные обходные пути, в том числе:

  • Установка internal_encoding=utf-8 в php.ini или использование ini_set('internal_encoding', 'utf-8');
  • Обеспечение того, что default_charset не не установлено в php.ini
  • Добавление набора символов к вызову функции, например, html_entity_decode($x, null, 'utf-8');

Похоже, что эти обходные пути имеют смешанные результаты.

0 голосов
/ 07 декабря 2018

Этот ответ неправильный, см. Комментарий к вопросу от @ miken32.

Я не буду возвращаться к stackoverflow некоторое время, поэтому могу дать вам только первую итерациюпроцесс, чтобы решить вашу проблему.Поместите в файл functions.php следующее:

set_error_handler( function( $errno, $errstr, $errfile, $errline ) {
    static $count = 0;
    if ( $count++ < 10 && $errno == E_USER_WARNING ) {
        error_log( print_r ( debug_backtrace(), true ) );
    }
} );

Это даст вам обратную трассировку при возникновении ошибки.На основании этого следа вам может потребоваться, а может и не потребоваться собрать дополнительные данные, чтобы понять вашу проблему.Функция set_error_handler задокументирована здесь , а функция debug_backtrace задокументирована здесь .Если есть другие ошибки E_USER_WARNING, вам необходимо выполнить дополнительную фильтрацию файла и номера строки.Опция php.ini error_reporting задокументирована здесь .

Я предполагаю, что эта проблема, вероятно, вызвана неверными данными в базе данных, которая недавно была введена в вашу базу данных.Надеюсь, обратная трассировка скажет вам, где эти данные.

Надеюсь, это поможет, удачи.

mc

...