error_log, залитый сообщениями "charset не поддерживается, предполагая, что utf-8"
Проблема: журнал ошибок блога 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 ответа
Похоже, это известная ошибка в 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');
Эти обходные пути, кажется, имеют смешанные результаты.
Этот ответ неправильный, см. Комментарий к вопросу от @miken32.
Я не буду возвращаться к stackru некоторое время, поэтому могу дать вам только первую итерацию процесса для решения вашей проблемы. Поместите следующее в ваш файл 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 описана здесь.
Я предполагаю, что эта проблема, вероятно, вызвана неправильными данными в базе данных, которые недавно были введены в вашу базу данных. Надеюсь, обратная трассировка скажет вам, где эти данные.
Надеюсь это поможет. Удачи.
тс