Php включить лог ошибок

The behaviour of these functions is affected by settings in php.ini.

Errors and Logging Configuration Options

Name Default Changeable Changelog
error_reporting NULL PHP_INI_ALL  
display_errors «1» PHP_INI_ALL  
display_startup_errors «1» PHP_INI_ALL Prior to PHP 8.0.0, the default value was "0".
log_errors «0» PHP_INI_ALL  
log_errors_max_len «1024» PHP_INI_ALL Had no effect as of PHP 8.0.0, removed as of PHP 8.1.0.
ignore_repeated_errors «0» PHP_INI_ALL  
ignore_repeated_source «0» PHP_INI_ALL  
report_memleaks «1» PHP_INI_ALL  
track_errors «0» PHP_INI_ALL Deprecated as of PHP 7.2.0, removed as of PHP 8.0.0.
html_errors «1» PHP_INI_ALL  
xmlrpc_errors «0» PHP_INI_SYSTEM  
xmlrpc_error_number «0» PHP_INI_ALL  
docref_root «» PHP_INI_ALL  
docref_ext «» PHP_INI_ALL  
error_prepend_string NULL PHP_INI_ALL  
error_append_string NULL PHP_INI_ALL  
error_log NULL PHP_INI_ALL  
error_log_mode 0o644 PHP_INI_ALL Available as of PHP 8.2.0
syslog.facility «LOG_USER» PHP_INI_SYSTEM Available as of PHP 7.3.0.
syslog.filter «no-ctrl» PHP_INI_ALL Available as of PHP 7.3.0.
syslog.ident «php» PHP_INI_SYSTEM Available as of PHP 7.3.0.

For further details and definitions of the
PHP_INI_* modes, see the Where a configuration setting may be set.

Here’s a short explanation of
the configuration directives.

error_reporting
int

Set the error reporting level. The parameter is either an integer
representing a bit field, or named constants. The error_reporting
levels and constants are described in
Predefined Constants,
and in php.ini. To set at runtime, use the
error_reporting() function. See also the
display_errors directive.

The default value is E_ALL.

Prior to PHP 8.0.0, the default value was:
E_ALL &
~E_NOTICE &
~E_STRICT &
~E_DEPRECATED
.
This means diagnostics of level E_NOTICE,
E_STRICT and E_DEPRECATED
were not shown.

Note:
PHP Constants outside of PHP

Using PHP Constants outside of PHP, like in httpd.conf,
will have no useful meaning so in such cases the int values
are required. And since error levels will be added over time, the maximum
value (for E_ALL) will likely change. So in place of
E_ALL consider using a larger value to cover all bit
fields from now and well into the future, a numeric value like
2147483647 (includes all errors, not just
E_ALL).

display_errors
string

This determines whether errors should be printed to the screen
as part of the output or if they should be hidden from the user.

Value "stderr" sends the errors to stderr
instead of stdout.

Note:

This is a feature to support your development and should never be used
on production systems (e.g. systems connected to the internet).

Note:

Although display_errors may be set at runtime (with ini_set()),
it won’t have any effect if the script has fatal errors.
This is because the desired runtime action does not get executed.

display_startup_errors
bool

Even when display_errors is on, errors that occur during PHP’s startup
sequence are not displayed. It’s strongly recommended to keep
display_startup_errors off, except for debugging.

log_errors
bool

Tells whether script error messages should be logged to the
server’s error log or error_log.
This option is thus server-specific.

Note:

You’re strongly advised to use error logging in place of
error displaying on production web sites.

log_errors_max_len
int

Set the maximum length of log_errors in bytes. In
error_log information about
the source is added. The default is 1024 and 0 allows to not apply
any maximum length at all.
This length is applied to logged errors, displayed errors and also to
$php_errormsg, but not to explicitly called functions
such as error_log().

When an int is used, the
value is measured in bytes. Shorthand notation, as described
in this FAQ, may also be used.

ignore_repeated_errors
bool

Do not log repeated messages. Repeated errors must occur in the same
file on the same line unless
ignore_repeated_source
is set true.

ignore_repeated_source
bool

Ignore source of message when ignoring repeated messages. When this setting
is On you will not log errors with repeated messages from different files or
sourcelines.

report_memleaks
bool

If this parameter is set to On (the default), this parameter will show a
report of memory leaks detected by the Zend memory manager. This report
will be sent to stderr on Posix platforms. On Windows, it will be sent
to the debugger using OutputDebugString() and can be viewed with tools
like » DbgView.
This parameter only has effect in a debug build and if
error_reporting includes E_WARNING in the allowed
list.

track_errors
bool

If enabled, the last error message will always be present in the
variable $php_errormsg.

html_errors
bool

If enabled, error messages will include HTML tags. The format for HTML
errors produces clickable messages that direct the user to a page
describing the error or function in causing the error. These references
are affected by
docref_root and
docref_ext.

If disabled, error message will be solely plain text.

xmlrpc_errors
bool

If enabled, turns off normal error reporting and formats errors as
XML-RPC error message.

xmlrpc_error_number
int

Used as the value of the XML-RPC faultCode element.

docref_root
string

The new error format contains a reference to a page describing the error or
function causing the error. In case of manual pages you can download the
manual in your language and set this ini directive to the URL of your local
copy. If your local copy of the manual can be reached by "/manual/"
you can simply use docref_root=/manual/. Additional you have
to set docref_ext to match the fileextensions of your copy
docref_ext=.html. It is possible to use external
references. For example you can use
docref_root=http://manual/en/ or
docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon
&url=http%3A%2F%2Fwww.php.net%2F"

Most of the time you want the docref_root value to end with a slash "/".
But see the second example above which does not have nor need it.

Note:

This is a feature to support your development since it makes it easy to
lookup a function description. However it should never be used on
production systems (e.g. systems connected to the internet).

docref_ext
string

See docref_root.

Note:

The value of docref_ext must begin with a dot ".".

error_prepend_string
string

String to output before an error message.
Only used when the error message is displayed on screen. The main purpose
is to be able to prepend additional HTML markup to the error message.

error_append_string
string

String to output after an error message.
Only used when the error message is displayed on screen. The main purpose
is to be able to append additional HTML markup to the error message.

error_log
string

Name of the file where script errors should be logged. The file should
be writable by the web server’s user. If the
special value syslog is used, the errors
are sent to the system logger instead. On Unix, this means
syslog(3) and on Windows it means the event log. See also:
syslog().
If this directive is not set, errors are sent to the SAPI error logger.
For example, it is an error log in Apache or stderr
in CLI.
See also error_log().

error_log_mode
int

File mode for the file described set in
error_log.

syslog.facility
string

Specifies what type of program is logging the message.
Only effective if error_log is set to «syslog».

syslog.filter
string

Specifies the filter type to filter the logged messages. Allowed
characters are passed unmodified; all others are written in their
hexadecimal representation prefixed with \x.

  • all – the logged string will be split
    at newline characters, and all characters are passed unaltered
  • ascii – the logged string will be split
    at newline characters, and any non-printable 7-bit ASCII characters will be escaped
  • no-ctrl – the logged string will be split
    at newline characters, and any non-printable characters will be escaped
  • raw – all characters are passed to the system
    logger unaltered, without splitting at newlines (identical to PHP before 7.3)

This setting will affect logging via error_log set to «syslog» and calls to syslog().

Note:

The raw filter type is available as of PHP 7.3.8 and PHP 7.4.0.


This directive is not supported on Windows.

syslog.ident
string

Specifies the ident string which is prepended to every message.
Only effective if error_log is set to «syslog».

cjakeman at bcs dot org

14 years ago

Using

<?php ini_set('display_errors', 1); ?>

at the top of your script will not catch any parse errors. A missing ")" or ";" will still lead to a blank page.

This is because the entire script is parsed before any of it is executed. If you are unable to change php.ini and set

display_errors On

then there is a possible solution suggested under error_reporting:

<?php

error_reporting
(E_ALL);

ini_set("display_errors", 1);

include(
"file_with_errors.php");

?>

[Modified by moderator]

You should also consider setting error_reporting = -1 in your php.ini and display_errors = On if you are in development mode to see all fatal/parse errors or set error_log to your desired file to log errors instead of display_errors in production (this requires log_errors to be turned on).

ohcc at 163 dot com

6 years ago

If you set the error_log directive to a relative path, it is a path relative to the document root rather than php's containing folder.

iio7 at protonmail dot com

1 year ago

It's important to note that when display_errors is "on", PHP will send a HTTP 200 OK status code even when there is an error. This is not a mistake or a wrong behavior, but is because you're asking PHP to output normal HTML, i.e. the error message, to the browser.

When display_errors is set to "off", PHP will send a HTTP 500 Internal Server Error, and let the web server handle it from there. If the web server is setup to intercept FastCGI errors (in case of NGINX), it will display the 500 error page it has setup. If the web server cannot intercept FastCGI errors, or it isn't setup to do it, an empty screen will be displayed in the browser (the famous white screen of death).

If you need a custom error page but cannot intercept PHP errors on the web server you're using, you can use PHPs custom error and exception handling mechanism. If you combine that with output buffering you can prevent any output to reach the client before the error/exception occurs. Just remember that parse errors are compile time errors that cannot be handled by a custom handler, use "php -l foo.php" from the terminal to check for parse errors before putting your files on production.

Roger

4 years ago

When `error_log` is set to a file path, log messages will automatically be prefixed with timestamp [DD-MMM-YYYY HH:MM:SS UTC]. This appears to be hard-coded, with no formatting options.

php dot net at sp-in dot dk

8 years ago

There does not appear to be a way to set a tag / ident / program for log entries in the ini file when using error_log=syslog. When I test locally, "apache2" is used.
However, calling openlog() with an ident parameter early in your script (or using an auto_prepend_file) will make PHP use that value for all subsequent log entries. closelog() will restore the original tag.

This can be done for setting facility as well, although the original value does not seem to be restored by closelog().

jaymore at gmail dot com

6 years ago

Document says
So in place of E_ALL consider using a larger value to cover all bit fields from now and well into the future, a numeric value like 2147483647 (includes all errors, not just E_ALL).

But it is better to set "-1" as the E_ALL value.
For example, in httpd.conf or .htaccess, use
php_value error_reporting -1
to report all kind of error without be worried by the PHP version.

Когда на сервере не работает один из сайтов — причины следует искать в программном коде, прежде всего следует изучить лог ошибок РНР (актуально для большинства сайтов, РНР является самым популярным языком веб-программирования). В рамках материала рассмотрено как включить лог ошибок php.

Включение лога ошибок PHP в php.ini

Все параметры РНР — в том числе, версия — задаются в файле php.ini, в нем же включается ведение лога программных ошибок. Если для сервера используется какая-либо панель управления — логирование можно включить в ней, если настройки сделаны вручную, то и ведение лога нужно включать вручную.

Делается это следующим образом:

display_errors = Off
log_errors = On
error_log = /var/log/php-errors.log

При активации display_errors ошибки будут выводится на экран, в директиве error_log задается путь к файлу, в который будет писаться информация необходимая для отладки проекта.

Затем нужно создать файл php-errors.log, на него необходимо выставить права позволяющие веб-серверу записывать в файл данные. В Debian подобных системах Apache работает от имени системного пользователя www-data

touch /var/log/php-errors.log

chown www-data: /var/log/php-errors.log

Затем нужно перезапустить веб-сервер, для Debian/Ubuntu

systemctl reload apache2

Для Centos

systemctl reload httpd

Получилось или нет можно увидеть в phpinfo. Там же можно посмотреть режим работы РНР (если это Apache Handler, то есть еще один способ включения лога, об этом ниже).

Как узнать еще режим работы PHP и текущее значение параметра error_log

Можно создать в корне сайта, работающего с сервера файл phpinfo и поместить в него одну функцию

<?php

phpinfo();

?>

И обратиться к файлу из браузера

http://sitename.com/phpinfo.php


Если применяются редиректы может потребоваться временно переименовать файл .htaccess в корне сайта.


В выводе phpinfo.php можно будет увидеть всю информацию о существующих настройках РНР

как проверить режим работы PHP

Режим работы РНР в примере Apache 2.0 Handler — РНР работает в режиме модуля веб-сервера.

Значение error_log отсутствует, значит в данной конфигурации логирование на уровне конфигурации сервера не включено.

Включить лог ошибок PHP

Описанный выше порядок действий позволит включить логирование ошибок РНР при любом режиме работы РНР. При отладке работы сайта при конфигурации с mod-apache следует также проверять логи веб-сервера.

Вся информация будет в них, логи нужно искать в /var/log/apache2 и /var/log/httpd в зависимости от дистрибутива. Лог можно найти выполнив

grep -rl sitename.com /etc/apache

grep -i log файл_из_вывода_предыдущей_команды | grep log

Как включить лог ошибок php в .htacccess при использовании Apache с mod_php

При использовании Apache с mod_php есть альтернативный вариант не требующий редактирования php.ini.

В .htaccess в корне сайта добавляется:

php_flag log_errors On
php_value error_log /var/log/php-errors.log

Выключается логирование установкой основной опции в Off

php_flag log_errors Off

Плюс такого способа в том, что его можно использовать на серверах где нет root доступа. Настройки будут применяться не ко всему серверу, а только к сайту в корне которого добавлен .htaccess.

С fast_cgi директива php_flag работать не будет — возникнет ошибка 500.

Читайте про ошибку 500 и ее причины. Очень часто она появляется как следствие неверной отработки скриптов или настроек сервера не удовлетворяющим требованиям программного кода сайта.

В этом руководстве мы расскажем о различных способах того, как в PHP включить вывод ошибок. Мы также обсудим, как записывать ошибки в журнал (лог).

Как быстро показать все ошибки PHP

Самый быстрый способ отобразить все ошибки и предупреждения php — добавить эти строки в файл PHP:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Что именно делают эти строки?

Функция ini_set попытается переопределить конфигурацию, найденную в вашем ini-файле PHP.

Display_errors и display_startup_errors — это только две из доступных директив. Директива display_errors определяет, будут ли ошибки отображаться для пользователя. Обычно директива dispay_errors не должна использоваться для “боевого” режима работы сайта, а должна использоваться только для разработки.

display_startup_errors — это отдельная директива, потому что display_errors не обрабатывает ошибки, которые будут встречаться во время запуска PHP. Список директив, которые могут быть переопределены функцией ini_set, находится в официальной документации .

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

Отображение ошибок PHP через настройки в php.ini

Если ошибки в браузере по-прежнему не отображаются, то добавьте директиву:

display_errors = on

Директиву display_errors следует добавить в ini-файл PHP. Она отобразит все ошибки, включая синтаксические ошибки, которые невозможно отобразить, просто вызвав функцию ini_set в коде PHP.

Актуальный INI-файл можно найти в выводе функции phpinfo (). Он помечен как “загруженный файл конфигурации” (“loaded configuration file”).

Отображать ошибки PHP через настройки в .htaccess

Включить или выключить отображение ошибок можно и с помощью файла .htaccess, расположенного в каталоге сайта.

php_flag display_startup_errors on
php_flag display_errors on

.htaccess также имеет директивы для display_startup_errors и display_errors.

Вы можете настроить display_errors в .htaccess или в вашем файле PHP.ini. Однако многие хостинг-провайдеры не разрешают вам изменять ваш файл PHP.ini для включения display_errors.

В файле .htaccess также можно включить настраиваемый журнал ошибок, если папка журнала или файл журнала доступны для записи. Файл журнала может быть относительным путем к месту расположения .htaccess или абсолютным путем, например /var/www/html/website/public/logs.

php_value error_log logs/all_errors.log

Включить подробные предупреждения и уведомления

Иногда предупреждения приводят к некоторым фатальным ошибкам в определенных условиях. Скрыть ошибки, но отображать только предупреждающие (warning) сообщения можно вот так:

error_reporting(E_WARNING);

Для отображения предупреждений и уведомлений укажите «E_WARNING | E_NOTICE».

Также можно указать E_ERROR, E_WARNING, E_PARSE и E_NOTICE в качестве аргументов. Чтобы сообщить обо всех ошибках, кроме уведомлений, укажите «E_ALL & ~ E_NOTICE», где E_ALL обозначает все возможные параметры функции error_reporting.

Более подробно о функции error_reporting ()

Функция сообщения об ошибках — это встроенная функция PHP, которая позволяет разработчикам контролировать, какие ошибки будут отображаться. Помните, что в PHP ini есть директива error_reporting, которая будет задана ​​этой функцией во время выполнения.

error_reporting(0);

Для удаления всех ошибок, предупреждений, сообщений и уведомлений передайте в функцию error_reporting ноль. Можно сразу отключить сообщения отчетов в ini-файле PHP или в .htaccess:

error_reporting(E_NOTICE);

PHP позволяет использовать переменные, даже если они не объявлены. Это не стандартная практика, поскольку необъявленные переменные будут вызывать проблемы для приложения, если они используются в циклах и условиях.

Иногда это также происходит потому, что объявленная переменная имеет другое написание, чем переменная, используемая для условий или циклов. Когда E_NOTICE передается в функцию error_reporting, эти необъявленные переменные будут отображаться.

error_reporting(E_ALL & ~E_NOTICE);

Функция сообщения об ошибках позволяет вам фильтровать, какие ошибки могут отображаться. Символ «~» означает «нет», поэтому параметр ~ E_NOTICE означает не показывать уведомления. Обратите внимание на символы «&» и «|» между возможными параметрами. Символ «&» означает «верно для всех», в то время как символ «|» представляет любой из них, если он истинен. Эти два символа имеют одинаковое значение в условиях PHP OR и AND.

error_reporting(E_ALL);
error_reporting(-1);
ini_set('error_reporting', E_ALL);

Эти три строки кода делают одно и то же, они будут отображать все ошибки PHP. Error_reporting(E_ALL) наиболее широко используется разработчиками для отображения ошибок, потому что он более читабелен и понятен.

Включить ошибки php в файл с помощью функции error_log ()

У сайта на хостинге сообщения об ошибках не должны показываться конечным пользователям, но эта информация все равно должна быть записана в журнал (лог).

Простой способ использовать файлы журналов — использовать функцию error_log, которая принимает четыре параметра. Единственный обязательный параметр — это первый параметр, который содержит подробную информацию об ошибке или о том, что нужно регистрировать. Тип, назначение и заголовок являются необязательными параметрами.

error_log("There is something wrong!", 0);

Параметр type, если он не определен, будет по умолчанию равен 0, что означает, что эта информация журнала будет добавлена ​​к любому файлу журнала, определенному на веб-сервере.

error_log("Email this error to someone!", 1, "someone@mydomain.com");

Параметр 1 отправит журнал ошибок на почтовый ящик, указанный в третьем параметре. Чтобы эта функция работала, PHP ini должен иметь правильную конфигурацию SMTP, чтобы иметь возможность отправлять электронные письма. Эти SMTP-директивы ini включают хост, тип шифрования, имя пользователя, пароль и порт. Этот вид отчетов рекомендуется использовать для самых критичных ошибок.

error_log("Write this error down to a file!", 3, "logs/my-errors.log");

Для записи сообщений в отдельный файл необходимо использовать тип 3. Третий параметр будет служить местоположением файла журнала и должен быть доступен для записи веб-сервером. Расположение файла журнала может быть относительным путем к тому, где этот код вызывается, или абсолютным путем.

Журнал ошибок PHP через конфигурацию веб-сервера

Лучший способ регистрировать ошибки — это определить их в файле конфигурации веб-сервера.

Однако в этом случае вам нужно попросить администратора сервера добавить следующие строки в конфигурацию.

Пример для Apache:

ErrorLog "/var/log/apache2/my-website-error.log"

В nginx директива называется error_log.

error_log /var/log/nginx/my-website-error.log;

Теперь вы знаете, как в PHP включить отображение ошибок. Надеемся, что эта информация была вам полезна.

here’s my log function:

You can edit the log rows by editing $maxLogs=5,
also the order to write your logs $logOrder='top'

<?php
lg('script start','start');

#Code......
lg('script end','End of code');

function lg($str,$mod='Your Log Category'){
    $ts = microtime(true);
    if(!defined('logTimer')){
        define('logTimer',microtime(true));
    }
    $diff=abs(round(($ts-logTimer)*1000,2));
    $maxLogs=5;
    $logOrder='top';#new Logs at top
    
    
    $filename = './log.txt';
    $log=[];
    if(!file_exists($filename)){
        if(!file_put_contents($filename,json_encode($log,128))){
            echo "Can’t open to write '$filename' Check Permissions";
            return;
        }
    }else{
        $c=file_get_contents($filename);
        if(trim($c)==''){$c='[]';}
        
        $log =@json_decode($c,true);
        if(!is_Array($log)){$log=[];}
    }
    $new=['mod'=>$mod,'date'=> date('Y-m-d H:i:s')." Scripttime: ".$diff."ms",'log'=>$str];
    if($logOrder=='top'){
        array_unshift($log , $new);
        $log=array_slice($log,0,$maxLogs);
        }else{
        $log[]=$new;
        $log=array_slice($log,0-$maxLogs,$maxLogs);
    }
    
    
    $logs=json_encode($log,128);
    if(!file_put_contents($filename,$logs) ){echo ("Can’t open to write '$filename' Check Permissions") ;return;}
    return $str;
}
?>

The Output looks like:

[
    {
        "mod": "delete",
        "date": "2022-08-04 13:48:02 0.33ms",
        "log": "test 2"
    },
    {
        "mod": "start",
        "date": "2022-08-04 13:48:29 0ms",
        "log": "test"
    },
    {
        "mod": "delete",
        "date": "2022-08-04 13:48:29 0.27ms",
        "log": "test 2"
    },
    {
        "mod": "start",
        "date": "2022-08-04 13:48:34 0ms",
        "log": "test"
    },
    {
        "mod": "delete",
        "date": "2022-08-04 13:48:34 0.92ms",
        "log": "test 2"
    }
]

 on
June 25, 2020

Errors are undesirable for users and you should do everything in your control to keep users away from them. However, they are of utmost importance for developers. They allow developers to understand the inaccuracies and vulnerabilities in their code by alerting them when their code breaks. They also provide relevant information about what went wrong, where, and what can be done to make amends. Absence of intelligent error reporting can not only make it extremely difficult to debug your project but can also let unnoticed, unresolved inconsistencies bleed into production code.

Most errors in PHP are by default not reported. This might be helpful for web applications in production, where you don’t want users to come across obscure error messages. However, during development, it is imperative to enable error messages — to be alerted about potential inaccuracies in your code before it is released for production.

In this post, we will look at what an error in PHP is, the different types of errors, and how you can enable error reporting in PHP.

Use these links to jump ahead in the tutorial:

What is a PHP error?

Common PHP Error Codes

Turn on Error Reporting in PHP

How to Log Errors in PHP

Conclusion

What is a PHP Error? 

An error is an indication of something going wrong in your web application. It is usually encountered when a part of your code has not been properly implemented, for example — mistakes in the syntax, logical inconsistencies, inattention to handling invalid user input, etc. An error in programming paradigms can be as trivial as a missed semicolon or an unclosed parenthesis to something as big as an undefined class function or an unhandled invalid user input.

Let us look at a few common PHP error categories and codes.  

Types of PHP Errors

There are primarily four types of errors in PHP — 

  1. Fatal run-time errors
  2. Warning errors
  3. Parse errors (Syntax errors)
  4. Notice errors

Note: We are able to access error messages in the example outputs shown below because error reporting has been turned on for visualization. We will look at how one can enable error messages in the next section. 

Fatal run-time errors (E_ERROR | Code 1)

As the name suggests, these errors can not be recovered from. They are encountered when the operation specified in your code can not be performed. As a result, execution is halted. 

For example — if you try to call a function that has not been defined, a fatal run-time error would be raised.

<?php
function foo() {
   echo "Function foo called.";
}
boo(); // undefined function 'boo'
?>

iMAGE 1.png

Warning errors (E_WARNING | Code 2)

A warning error is more subtle in that regard. It does not halt execution — just acts as a friendly reminder of something incorrect in your code, that might pose a bigger problem in the future. 

The most common example of a warning error being raised is when you include a missing file in your code.

<?php
include('filename.txt'); // arbitrary file that is not present
echo "Hello world";
?>

image 2.png

Notice how the warning error has not forced the code to halt, allowing the print statement below to be executed.

Parse errors (E_PARSE | Code 4)

Parse errors are encountered as a result of purely syntactical mistakes in one’s code. These errors are generated during compilation, and as a result your code exits before it is run. 

Parse error examples include — missing semicolons, unused or unclosed brackets, quotes, etc. Below is an example of the same.

<?php
echo "Hello world";
echo Hello world // no quotes or semicolon used
?>

image 3.png

Notice errors (E_NOTICE | Code 8)

Notice errors are similar to warning errors in that they are encountered during run-time and they don’t halt code execution. They indicate that something is incorrect in the script that even though doesn’t interrupt execution, should be fixed.

A common example would be trying to use an undefined variable in your code.

<?php
$a = 1;
$c = $a + $b; // undefined variable $b
echo "Hello world";
?>

IMAGE 4.png

Turn on Error Reporting in PHP

Error reporting in PHP is usually disabled by default. It can be enabled in three primary ways —

  • Directly from code
  • By editing the php.ini configuration file
  • By editing the .htaccess file.

Before we look into the various methods, a word of caution is necessary. Make sure to disable error reporting for your web application’s production code. You wouldn’t want your users to come across obscure error messages when using your website.

Directly from code

Using the error_reporting() function

To configure error reporting in your PHP project, you can use the error_reporting function. This allows you to manipulate error reporting at run-time.

error_reporting ([ int $level ] ) : int

PHP has various types of errors that we looked at earlier in this post. These types can be provided to the error_reporting function as an argument to specify the kinds of errors that should be reported.

To report all PHP errors you can use the function in any of the two ways shown below. 

<?php
// Report all PHP errors
error_reporting(E_ALL);
?>

or

<?php
// Report all PHP errors
error_reporting(-1);
?>

Both of the above-mentioned methods serve the same purpose, and therefore you can use either of them to enable error reporting for all types of errors. 

Let us see this in action using an example — 

<?php
error_reporting(E_ALL);

echo "Hello world";
// xyz is an undefined variable; should raise an error.
echo $xyz;
?>

OUTPUT:

image 5.png

As we can see, a Notice error has been reported. Had we not used the error_reporting function, PHP would have implicitly taken care of it and not reported anything at all. 

This only strengthens our above argument about how unresolved issues can go unnoticed if errors are not appropriately reported.

You can also disable error reporting using the function as such —

//Turn off error reporting
error_reporting(0);

For reporting only specific kinds of errors, you can provide the required error types as a parameter to the error_reporting function using the bitwise OR operator as shown below —

// Report only selected kinds of errors
error_reporting(E_WARNING | E_ERROR | E_PARSE | E_NOTICE);

To enable error reporting for all but one (or more) error levels, you can use the below syntax — 

// Report all errors except E_WARNING
error_reporting(E_ALL & ~E_WARNING);

Using the ini_set() function

We can also use the ini_set function to configure error reporting. This function allows us to initialize or modify the various configuration options (specified using a .ini file) directly from our code. This function modifies the configuration options only for the duration of the code (run-time).

You can call this function by adding the following line to your code —

ini_set('error_reporting', E_ALL);

We can similarly manipulate error reporting by applying different values for the ‘error_reporting’ option.

// Report selected kinds of errors

ini_set('error_reporting', E_WARNING | E_ERROR | E_PARSE | E_NOTICE);

Even though the ini_set function allows us to easily modify the configuration options directly from our code, it is a better practice to keep your PHP configurations in a separate php.ini file on your system. Let’s look at how we can do that in the next section.

By editing the php.ini configuration file

The php.ini serves as a configuration file for your project. It is read when PHP is initialized and can be used for a variety of things — storing environment variables, configuring server ports, error reporting, memory management, etc. You can find a list of the various configuration directives and their default values here.

Therefore, to enable error reporting in PHP, you need to edit this configuration file. The php.ini file is usually present in the /etc directory on Linux systems. You can locate the file by printing the output of the phpinfo() function in your code. The file’s path is provided under the ‘loaded configuration file’ row of the output.

image 6.png

Note: If the path mentioned in your output refers to a directory (for example- /etc) and not the file, you can create a new php.ini file inside that directory.

To enable error reporting, you can add either of the following lines to the php.ini file, and restart your server for the effects to take place.

error_reporting = E_ALL

or

error_reporting = -1

To also report errors encountered during PHP’s startup sequence, you can use the following directive in your php.ini file —

display_startup_errors = 1

Some posts on the internet also suggest enabling the ‘display_errors’ option for displaying error messages. In most cases, this is not required since that option is usually turned on by default in PHP. 

If it is disabled in your system, you can turn it on by adding the following line in your php.ini file — 

display_errors = 1

By editing the .htaccess file

The .htaccess (stands for hypertext-access) is a configuration file for manipulating various options provided by Apache-based web-servers. 

Even though it can be a little difficult to set up initially based on your operating system, the .htaccess file allows you to exercise control over various server options at the local directory level and the global system level.

To enable error reporting, add the following two lines to your .htaccess file —

php_flag display_startup_errors on
php_flag display_errors on

Even though (as mentioned above) the display_errors property is by default ON, it is likely that your system admin might have disabled that property globally and you might want to enable it for a local project. Overriding the global property using the local .htaccess file can be a handy approach in such situations.

How to Log Errors in PHP

In large-scale PHP web applications that involve many processes like API requests, data processing etc, it is a good practice to store logs of your output and error messages. Good logging measures allow us to keep track of the inner workings of the system for effective debugging and maintenance. Let’s look at how we can create error logs in PHP.

You need to do two things to store error logs for your project —

  • Enable ‘log_errors’ option
  • Specify the ‘error_log’ file

Once this has been done, all your errors will be automatically logged to the specified error_log file. Just like error reporting, error logging can be set up from any of these three places — directly from code, from the php.ini configuration file and from the .htaccess file

Directly from code

Using the ini_set function we can configure the relevant PHP options as such — 

ini_set('log_errors', 1); // enabling error logging   
ini_set('error_log', '/path/my-error-file.log'); // specifying log file

After doing this, all our errors would be automatically logged to the specified log file. Let us look at an example —

<?php
   ini_set('log_errors', 1); // enabling error logging
   ini_set('error_log', '/path/my-error-file.log'); // specifying log file

   echo $b; // undefined variable should raise error
?>

Now, let’s open our project root folder and open the ‘my-error-file.log’ file to see if the error message has been logged.

IMAGE 7.png

As you can see, a timestamp has also been added to the error message, as we’d expect any effective logging system to do. All errors further encountered in your code will be appended to this file.

Another alternative to logging errors from your code would be to manually do so using the error_log function. You can use the function as shown below to write to a log file as shown below —

<?php
   echo "Hello world";
   // manually logging error message ->
   error_log('My error message ⚠️', 3, 'my-error-file-2.log'); 
?>

The first and third arguments of the function represent the error message and the log file respectively. The second argument in the above function (3) is an option that specifies that the error message should be appended to the output of the file. 

You can read more about the arguments of the error_log function here.

In this case, as can be seen, one has to specify the error message and the logging file each time. Also, in this method, timestamps are not added to the generated log messages by default.

Using the php.ini configuration file

Enabling logging from the configuration file is pretty straightforward. You only need to add two directives to your php.ini file as shown below — 

log_errors = on
error_log = /path/my-error-file.log

After saving the file, restart your server to enable the automatic error logging to the specified file.

Using the .htaccess file

You can add the following two lines to your .htaccess file to enable error logging —

php_flag  log_errors on
php_value error_log /path/my-error-file.log

This also serves the same purpose — enabling error logging, followed by specifying the output log file.

Conclusion

In this post, we learned about what PHP errors are, their different types (fatal errors, warnings, parse errors, and notices), about how important they are, and how you can enable error reporting for your web application. We looked at three different ways of initiating error reporting and storing log files — directly from code, through the php.ini configuration file, and from the server-based .htaccess file.

Now that you know how important it is to be mindful of errors, go ahead and enable error reporting in your project, maintain error logs, and build yourself a full-proof web application! You can also view your PHP errors in ScoutAPM’s dashboard. Also, make sure to disable error displaying when you release your website for production.

After you have enabled error reporting in your project, you might want to learn about how to handle these raised errors (exceptions) in your code. For this, you can refer to our post on Exception Handling in PHP — PHP Advanced Exceptions.

Stay safe! Keep learning! Happy coding!

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Php exe ошибка при запуске приложения 0xc000007b
  • Php new mysqli ошибка
  • Php включить вывод ошибок на странице
  • Php curl код ошибки
  • Php mysqli вывод ошибки

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: