php error_log не работает

Об этом спрашивали 1000 раз, и я просмотрел различные посты, прежде чем опубликовать это, но не нашел ответа. Пока я программировал на PHP, это всегда было кошмаром, чтобы начать работать. Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?

Я установил error_log в ini-файл вместе с error_reporting = E_ALL | E_STRICT

Что еще мне не хватает? Это обычно давало это мне. Я хочу, чтобы этот набор был в INI-файле, а не в моих скриптах.

Другая интересная вещь, которая происходит, заключается в том, что когда я намеренно пытаюсь выдать ошибку в одном из моих сценариев, Apache перезапускается снова и снова.


Это мой журнал событий после одной ошибки. Лут на отметке времени

Wed Nov 04 19:34:23 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:23 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:23 2009] [notice] Parent: Created child process 1700
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Child process is running
[Wed Nov 04 19:34:23 2009] [notice] Child 3008: Released the start mutex
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Acquired the start mutex.
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Starting 64 worker threads.
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Starting thread to listen on port 80.
[Wed Nov 04 19:34:24 2009] [notice] Child 3008: All worker threads have exited.
[Wed Nov 04 19:34:24 2009] [notice] Child 3008: Child process is exiting
[Wed Nov 04 19:34:53 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:53 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:53 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:53 2009] [notice] Parent: Created child process 3656
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Child process is running
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Acquired the start mutex.
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Starting 64 worker threads.
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Starting thread to listen on port 80.
[Wed Nov 04 19:34:53 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:54 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:54 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:54 2009] [notice] Parent: Created child process 3980
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Child process is running
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Acquired the start mutex.
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Starting 64 worker threads.
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Starting thread to listen on port 80.
[Wed Nov 04 19:34:54 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:54 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:54 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:54 2009] [notice] Parent: Created child process 1600
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Child process is running
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Acquired the start mutex.
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Starting 64 worker threads.
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Starting thread to listen on port 80.
[Wed Nov 04 19:34:55 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:55 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:55 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:55 2009] [notice] Parent: Created child process 1068
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Child process is running
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Acquired the start mutex.
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Starting 64 worker threads.
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Starting thread to listen on port 80.
[Wed Nov 04 19:34:55 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:55 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:55 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:55 2009] [notice] Parent: Created child process 3220
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Child process is running
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Acquired the start mutex.
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Starting 64 worker threads.
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Starting thread to listen on port 80.

17 ответов

Проверьте, что PHP-FPM явно не установлен error_log:

Убедитесь, что файл /etc/php-fpm.d/www.conf не содержит php_admin_value настройки для error_log. Найдите следующее и закомментируйте их, используя точку с запятой:

; NOTE: If these are set, ini_set('error_log', 'path') will have no effect 
; inside your php code, and this will be forced to be the value always.
; php_admin_value[error_log] = /var/log/php-fpm/www-error.log
; php_admin_flag[log_errors] = on

Затем перезапустите php-fpm:

systemctl restart php-fpm

Проверьте, что файлы Apache.htaccess не устанавливают error_log значение с использованием

php_admin_value настройки в файлах конфигурации apache не могут быть переопределены, поэтому убедитесь, что у вас нет php_admin_value для error_log настройка в файлах конфигурации Apache. Также проверьте для php_value настройки на всякий случай.

Сайт PHP - Как изменить настройки конфигурации

Вот мое руководство по устранению неполадок error_log() звонки не работают.

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

    Это зависит от того, какой сервер вы используете. Чтобы начать, взгляните на Apache ErrorLog вариант, если вы используете Apache или Nginx error_log вариант, если вы используете Nginx. Убедитесь, что он установлен в файл. Если вы используете такой инструмент, как Valet, обратите внимание, что он использует серверное программное обеспечение, такое как Nginx, за кулисами.

  2. Проверьте разрешения файла журнала ошибок вашего сервера.

    В Unix-подобных системах он должен быть доступен для записи для правильного пользователя и группы, а права родительского каталога и всех его предков также должны быть правильными. использование chmod а также chown,

  3. Проверьте конфигурацию PHP в .ini файлы

    В частности, проверьте для log_errors = On а также error_reporting = E_ALL | E_STRICT а также error_log = /tmp/example/php_errors.log (см. документы для log_errors, error_reporting а также error_log настройки конфигурации). Чтобы найти .ini файл, посмотрите на вывод phpinfo();, Если error_log не установлен, по умолчанию он переходит в журнал ошибок сервера, упомянутый в предыдущих шагах. Если error_log установлен в файл, он должен уже существовать и быть доступным для записи, как и в предыдущих шагах. Не забудьте перезапустить сервер после изменения конфигурации.

  4. Убедитесь, что настройки PHP не изменяются в зависимости от конфигурации сервера.

    Конфигурация вашего сервера (даже .htaccess) может изменить настройки конфигурации PHP. В Apache это делается с помощью php_admin_value а также php_admin_flag ( документы). Например, вы можете найти в вашем .htaccess подать эту строку: php_admin_flag[log_errors] = off, Не забудьте перезапустить сервер после изменения конфигурации.

    На этом этапе вы сможете создать тестовый файл. test.php с содержанием <?php error_log("test"); перезагрузите сервер и откройте URL в браузере, и вы должны увидеть test в журнале ошибок (либо на сервере, либо указанном error_log =). Но продолжайте читать.

  5. Убедитесь, что настройки PHP не изменяются во время выполнения.

    log_errors опция может быть изменена во время выполнения, запустив ini_set('log_errors', 1); и так могут другие параметры конфигурации error_reporting а также error_log, Также обратите внимание, что есть специальный error_reporting() Функция PHP, которая изменяет конфигурацию во время выполнения. Поиск в вашей кодовой базе для любых вызовов ini_set или же error_reporting, WordPress, например, запускает их в зависимости от значения WP_DEBUG,

Другие вещи, на которые стоит обратить внимание: у вас могут быть проблемы с разрешениями в SELinux (см. Этот ответ).

Вам также нужно установить log_errors = On в php.ini.

На случай, если у кого-то еще возникнут проблемы с регистрацией ошибок в локальной среде разработки, вот что для меня исправило:

На окнах, error_log должен быть установлен полный путь к журналу для error_log() работать (error_log = c:\apache\php_errors.log). Однако если error_log = php_errors.log без пути php по-прежнему сможет регистрировать ошибки запуска, такие как

PHP Startup: Unable to load dynamic library 'ext\php_mysqli.dll' - The specified module could not be found

Проблема, с которой я столкнулся, заключалась в том, что указанный мной журнал ошибок был защищен от записи. Все мои настройки.htaccess были правильными, PHP просто не мог записать в журнал ошибок, потому что у него не было разрешений. Это исправило это прямо для меня:

chmod 777 watermellon-app-errors.log

Очевидно, вы захотите изменить.log на любой файл, который вы используете для журнала.

Если установлена ​​директива error_log, файл будет использоваться для записи ошибок php, если он не установлен, ошибки будут записываться в журнал Apache. Взгляните на http://us3.php.net/manual/en/errorfunc.configuration.php.

Файл error_log и каталог, в котором он находится, должен быть доступен для записи пользователю, под которым работает Apache. Если файл не создается, возможно, это связано с проблемой разрешений.

Я не знаю наверняка, почему Apache будет зависать от вас, но я предполагаю, что это какая-то проблема с разрешениями.

Я не понимаю почему, но журнал ошибок теперь работает. Вот что я сделал. Я сдался и прокомментировал директиву error_log и закрыл INI-файл. Я запустил скрипт с ошибкой синтаксического анализа, чтобы увидеть, что Apache все еще падает, и я получил ошибку PHP в файле журнала. Это странно, потому что в ini-файле больше нет включенного error_log, а мой скрипт не использует ini_set().

У кого-нибудь есть объяснение этому безумию? Кроме того, Apache больше не падает.

Если вы используете Fedora, SELinux (включенный по умолчанию) не позволит apache / httpd добавлять ошибки в ваш файл журнала, даже если ваш файл указан в php.ini, и его каталог содержит все разрешенные разрешения.

Вы можете увидеть, происходит ли это, посмотрев файл системного журнала в /var/log/messages

Идеальным решением является настройка SELinux для разрешения доступа к файлу журнала.

Более быстрое решение - отключить SELinux в /etc/selinux/config, установив SELINUX в ​​отключенное состояние.

После этого вам нужно будет перезагрузить систему, чтобы изменения вступили в силу.

В моем случае, на сервере разработки CentOS, после полной yum update разрешение на / var / log / http было изменено на 700, а пользователь на "root", поэтому пользователь "apache" не смог войти или написать в него. Он все еще мог записать в существующий файл /var/log/httpd/error.log, но не смог создать новый файл, так как я использую файлы журнала с суффиксом даты. Выдача команды

chown apache /var/log/httpd

решил проблему.

Для дальнейшей отладки: phpinfo();

Показывает, что текущая настройка error_log может быть полезна, когда vhost не ведет журнал.

Закончился здесь после того, как этот параметр был переопределен из php.ini и vhost. Был завершен вход в системный журнал.

Для меня создание файла решило проблему

  1. в php.ini настроить журнал в файл

             log_errors = On
     error_log = /var/log/php_error.log
    
  2. перезапустить apache

             sudo systemctl restart apache2
    
  3. создайте файл журнала, например:

             sudo touch /var/log/php_error.log
    
  4. дать правильные права (владелец должен быть apache)

             sudo chown www-data:root /var/log/php_error.log
    

(и если еще не установлен)

          sudo chmod 0644 /var/log/php_error.log
  1. протестируйте таким образом, например:

             sudo vim /var/www/.../index.php
    
     <html>
     <body>
     PHP file:
     <?php
     echo "hello world";
     trigger_error("User error in PHP", E_USER_ERROR);
     ?>
     </body>
     </html>
    
  2. проверьте, что ошибка написана

             sudo less /var/log/php_error.log 
    

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

Как это работает в моей Ubuntu (Apache 2.4.7, PHP 5.5.9) следующим образом:

скрипт командной строки:

  • записывает журнал в путь, указанный error_log если log_errors = On, Настройки в /etc/php5/cli/php.ini;

веб-запрос через apache:

  • если log_errors = On (/etc/php5/apache2/php.ini), ошибка добавлена ​​в путь, указанный ErrorLog директива apache в виртуальном хосте. Если эта директива не существует, php.ini error_log путь используется;
  • если log_errors = Off не логи нигде не пишутся;

Насколько я помню, это почти сработало в большинстве стеков Linux

Была такая же проблема. Исправил это следующим образом:

$ chmod 0777 -R /var/log/apache2
$ apachectl restart

Я думаю, что PHP работает как пользователь www-data пока доступ к /var/log/apache2 ограничен root. Итак, это исправляет.

Error_log = "C:\php\Log\error.log" у меня тоже не работал. Решением для меня было то, что вы не должны создавать error.log самостоятельно, потому что PHP сделает это за вас. Смотрите доску объявлений PHP. Я использую PHP 5.2 на сервере Windows 2008

Это помогло мне.

setsebool -P httpd_unified 1

Обратите внимание, что это будет предпочтительный метод ниже, чтобы попробовать сначала:

semanage fcontext -a -t httpd_sys_rw_content_t 'errorLogNameHere.error.log
restorecon -v 'errorLogNameHere.error.log'

Этот ответ был получен из журналов выполнения этой командной строки:

journalctl -xe 

Дополнительная информация о системе, на которой я работал: PHP 7.0 и CentOS 7

Не уверен, если это не очевидно, но проблема была в конфигурации Apache для записи файлов. Я попробовал chmod 777, chmod a+w в каталоге журналов, но у меня это не сработало.

Надеюсь, это может кому-нибудь помочь.

Убедитесь, а также установить

display_errors = On

И попробовать

 error_reporting(E_ALL);

В вашем коде. Часто я включаю скрипт конфигурации ошибок времени выполнения, который включает ошибки во время разработки и выключает их, когда я нет. Это выглядит примерно так:

if ($debugmode == 'on') {
    error_reporting(E_ALL); 
    ini_set("display_errors", 1);
}else { 
    error_reporting(0); 
    ini_set("display_errors", 0);
}

Надеюсь это поможет.

** Я не правильно прочитал, вы хотите регистрировать ошибки вместо отображения, в этом случае ответ Хаоса - это то, что вы ищете.

Другие вопросы по тегам