Запись ошибок выполнения PHP скриптов в файл
Все php ошибки нужно обязательно записывать в лог-файл и регулярно изучать его. Если этого не делать — есть шанс пропустить часть багов, которые появляются в процессе работы или тестирования и не выводятся на экран. По умолчанию, запись ошибок в файл отключена на многих конфигурациях (и это правильно!), но есть несколько способов это исправить:
Способ 1 — написать функцию перехвата ошибок и записи их в файл:
# В начале нашего скрипта пишем: set_error_handler('err_handler'); function err_handler($errno, $errmsg, $filename, $linenum) < $date = date('Y-m-d H:i:s (T)'); $f = fopen('errors.txt', 'a'); if (!empty($f)) < $filename =str_replace($_SERVER['DOCUMENT_ROOT'],'',$filename); $err = "$errmsg = $filename = $linenum\r\n"; fwrite($f, $err); fclose($f); >>
Способ 2 — изменить php.ini:
log_errors = On error_log = /var/log/php_errors.log
Способ 3 — добавить в .htaccess:
php_value log_errors "On" php_value error_log /var/log/php_errors.log
Способ 4 — добавить в самое начало php скрипта:
ini_set('log_errors', 'On'); ini_set('error_log', '/var/log/php_errors.log');
Если создание сайтов было выполнено качественно, то и ошибок выводиться на экран не должно. Конечно, не всегда этого можно добиться по этому в идеале, перестраховаться и писать уведомления в файл. Крайне не рекомендуется использовать символ собаки @ для подавления ошибок т.к. в последствии можно пропустить очень важное уведомление.
Запись в лог-файл в PHP
Несколько вариантов как быстро организовать запись данных в лог-файл.
Строки текста
$log = date('Y-m-d H:i:s') . ' Запись в лог'; file_put_contents(__DIR__ . '/log.txt', $log . PHP_EOL, FILE_APPEND);
Запись в лог-файле:
2019-02-02 16:00:38 Запись в лог
Массивы
Если нужно записать в лог обычный массив, массив с индексами или многомерный массив, поможет функция print_r() .
$array = array( 'foo' => 'bar', 'helo' => 'world', 'array' => array(1, 2) ); $log = date('Y-m-d H:i:s') . ' ' . print_r($array, true); file_put_contents(__DIR__ . '/log.txt', $log . PHP_EOL, FILE_APPEND);
Запись в лог-файле:
2019-02-02 16:43:27 Array ( [foo] => bar [helo] => world [array] => Array ( [0] => 1 [1] => 2 ) )
В одну строку
$array = array( 'foo' => 'bar', 'helo' => 'world', 'array' => array(1, 2) ); $log = date('Y-m-d H:i:s') . ' '; $log .= str_replace(array(' ', PHP_EOL), '', print_r($array, true)); file_put_contents(__DIR__ . '/log.txt', $log . PHP_EOL, FILE_APPEND);
2019-02-02 16:56:00 Array([foo] => bar[helo] => world[array] => Array([0] => 1[1] => 2))
Результат работы PHP скрипта
Если нужно добавить в лог результат работы PHP скрипта, помогут функции буферизации ob_start() и ob_get_clean() .
ob_start(); // Вывод заголовков браузера. foreach (getallheaders() as $name => $value) < echo "$name: $value\n"; >$log = date('Y-m-d H:i:s') . PHP_EOL . ob_get_clean() . PHP_EOL; file_put_contents(__DIR__ . '/log.txt', $log, FILE_APPEND);
Запись в лог-файле:
2019-11-20 12:54:58 Host: example.com X-HTTPS: 1 X-Forwarded-Proto: https Connection: close cache-control: max-age=0 upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534 (KHTML, like Gecko) sec-fetch-user: ?1 accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 x-compress: null sec-fetch-site: none sec-fetch-mode: navigate accept-encoding: gzip, deflate, br accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7 cookie: PHPSESSID=123
Запись в лог ошибок PHP
Если логирование предполагает фиксацию только ошибок, то лучше писать их в общий лог PHP, подробнее на php.net.
error_reporting(E_ALL); ini_set('error_log', __DIR__ . '/php-errors.log'); error_log('Запись в лог', 0);
[02-Feb-2019 20:18:17 Europe/Moscow] Запись в лог
error_log
Отправляет сообщение об ошибке в лог web-сервера или в пользовательский файл.
Список параметров
Сообщение об ошибке которое должно быть логировано.
Определяет куда отправлять ошибку. Возможны следующие значения:
0 | Сообщение message отправляется в системный регистратор PHP, используя механизм логирования операционной системы, или файл, в зависимости от значения директивы error_log в конфигурационном файле. Это значение по умолчанию. |
1 | Сообщение message отправляется электронной почтой на адрес, установленный в параметре destination . Это единственный тип сообщения, где используется четвертый параметр extra_headers . |
2 | Больше не используется. |
3 | message применяется к указанному в destination файлу. Перенос строки автоматически не добавляется в конец message . |
4 | Сообщение message отправляется напрямую в обработчик логера SAPI. |
Назначение. Устанавливается в зависимости от параметра message_type .
Дополнительные заголовки. Используется, когда значение параметра message_type — 1. Данный тип сообщения использует ту же внутреннюю функцию, что и mail() .
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Примечания
error_log() не является бинарнобезопасным. message обрезается по null-символу.
message не должен содержать null-символ. Учтите, что message может передаваться в файл, по почте, в syslog, и т.д.. Используйте подходящую преобразующую или экранирующую функцию, base64_encode() , rawurlencode() или addslashes() перед вызовом error_log() .
Примеры
Пример #1 Примеры использования error_log()
// Отправляет уведомление посредством серверного лога, если мы не можем
// подключиться к базе данных.
if (! Ora_Logon ( $username , $password )) error_log ( «Oracle database not available!» , 0 );
>
?php
// Уведомить администратора электронной почтой, если невозможно выделить ресурсы для FOO
if (!( $foo = allocate_new_foo ())) error_log ( «Big trouble, we’re all out of FOOs!» , 1 ,
«operator@example.com» );
>
// другой способ вызвать error_log():
error_log ( «You messed up!» , 3 , «/var/tmp/my-errors.log» );
?>
Список изменений
Версия | Описание |
---|---|
5.2.7 | Добавлен 4-й тип значения в message_type . |