Проблема: Журнал ошибок в блоге 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 ГБ:
htmlentities()
, htmlspecialchars()
, html_entity_decode()
#^[a-z]:[/\\]#i
, meta_value
, 0x7fe858ae2920
, /home/someone-elses-account-name/public_html/includes/functions.php
…Откуда эти ценности?
Где я могу начать устранять неисправности?
Редактировать: Решение
Ниже есть отличный ответ с объяснением того, почему это происходит. К сожалению, находясь на виртуальном хостинге и используя сторонние приложения, я не мог использовать никаких обходных путей. Но после разговора с хостинг-провайдером они добавили internal_encoding utf-8
Конфиг веб-сервера Apache через include config (что-то в этом роде). И это сработало.
Похоже, это известная ошибка в PHP, которую трудно воспроизвести, поэтому она застряла на некоторое время.
https://bugs.php.net/bug.php?id=71876
Были предложены различные обходные пути, в том числе:
internal_encoding=utf-8
в php.ini или используя ini_set('internal_encoding', 'utf-8');
default_charset
является не установлен в php.inihtml_entity_decode($x, null, 'utf-8');
Эти обходные пути, кажется, имеют смешанные результаты.
Этот ответ неверный, пожалуйста, смотрите комментарий к вопросу @ 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 задокументирована Вот.
Я предполагаю, что эта проблема, вероятно, вызвана неправильными данными в базе данных, которые недавно были введены в вашу базу данных. Надеюсь, обратная трассировка скажет вам, где эти данные.
Надеюсь это поможет. Удачи.
тс