Назад | Перейти на главную страницу

php записывает устаревшие ошибки в журнал ошибок apache

Я только что обновился с Debian Lenny до Squeeze и заметил, что мой /var/log/apache2/errors.log засыпается следующими ошибками:

<b>Warning</b>:  Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in <b>Unknown</b> on line <b>0</b><br />
<br />
<b>Warning</b>:  Directive 'register_globals' is deprecated in PHP 5.3 and greater in <b>Unknown</b> on line <b>0</b><br />

Мне это кажется странным, поскольку это системный журнал, и php (через apache) пытается записать в него html-код. Это происходит при каждой загрузке страницы на сервере (включая любой виртуальный хост).

Отключить эти значения пока нельзя (я использую неподдерживаемую кодовую базу). Мой php.ini среди прочего содержит:

error_reporting  = E_ALL & ~E_NOTICE & ~E_DEPRECATED
display_errors = On
register_globals = On
magic_quotes_gpc = On

Я не уверен, ошибка ли это в конфигурации php или конфигурации apache. Кто-нибудь знает, как я могу избежать записи этих сообщений в errors.log при каждой загрузке страницы?

Спасибо, Гардар

В то время как другие ответы здесь воля остановить запись ошибок в журнал ошибок, они просто игнорируют сообщение об ошибке и не исправляя ошибка.

Ошибка в этом случае заключается в том, что на вашем php.ini все еще есть magic_quotes_gpc on или magic_quotes_gpc off где-то в нем. То же верно и для register_globals on или register_globals off.

Ошибка не в том, что директива включена или выключена. Ошибка в том, что директивы вообще не должно существовать. Прокомментируйте эти строки из вашего php.ini или удалите их полностью, и PHP перестанет писать ошибки об устаревших директивах.

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

Причина, по которой это ошибка в PHP 5.3, заключается в том, что в PHP 6 этих директив даже не существует, и PHP 6 будет вести себя так, как если бы они были отключены. Если вы когда-либо планируете перейти на PHP 6, сейчас самое время начать обновление или замену вашего приложения.

Еще одно решение, которое вы можете попробовать, - это откат PHP до ветки 5.2 или 5.1.

Что касается ошибок записи PHP в журнал Apache, это естественно, потому что PHP работает как модуль Apache. Вы можете поставить что-то вроде error_log = /var/log/php_errors.log в свой php.ini и перезапустите Apache, чтобы ошибки PHP были отделены от ошибок Apache. Пока вы там, я бы рекомендовал изменить display_errors к off. Сообщения об ошибках часто могут содержать конфиденциальную информацию, которую злоумышленник не хотел бы видеть. Скорее всего, вы увидите это в своем php.ini:

; - display_errors = Off           [Security]
;     With this directive set to off, errors that occur during the execution of
;     scripts will no longer be displayed as a part of the script output, and thus,
;     will no longer be exposed to remote users.  With some errors, the error message
;     content may expose information about your script, web server, or database
;     server that may be exploitable for hacking.  Production sites should have this
;     directive set to off.

Нет разумной причины, по которой сообщения об ошибках содержат HTML.

Чтобы ответить на другой вопрос, который вы не задавали, причина, по которой PHP сообщает, что это in <b>Unknown</b> on line <b>0</b> заключается в том, что сообщение об ошибке было разработано для строк кода PHP, которые вы написали, но ошибка, которую оно обнаружило, была связана с анализом php.ini до того, как он даже прочитал одну строку кода или даже открыл файл .php. Поскольку он не открывал файл и не имеет номера строки, он сообщает о них как «Неизвестно» и «0».

Этого поведения можно избежать, установив display_errors = Off. Я не очень доволен этим решением, запись ошибки html-формата в файлы журнала кажется мне странной. Если кто понимает такое поведение, расскажите :)

удалить ~ E_DEPRECATED

тадам :)