Подтвердить что ты не робот

Ошибка php error_log не работает

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

У меня есть error_log, установленный в ini файле вместе с error_reporting = E_ALL | E_STRICT

Что еще мне не хватает? Обычно это давало мне. Я хочу этот набор в ini файле, а не в моих сценариях.

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


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

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.
4b9b3361

Ответ 1

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

Ответ 2

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

В окнах 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

Ответ 3

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

chmod 777 watermellon-app-errors.log

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

Ответ 4

Убедитесь, что 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 Website - Как изменить настройки конфигурации

Ответ 5

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

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

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

Ответ 6

Вот мое руководство по устранению неполадок с вызовами 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 (docs). Например, вы можете найти в вашем файле .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. Также обратите внимание, что есть специальная PHP-функция, которая изменяет конфигурацию во время выполнения. Ищите в своей базе кодов любые вызовы ini_set или error_reporting. Например, WordPress запускает их в зависимости от значения WP_DEBUG.

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

Ответ 7

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

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

Ответ 8

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

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

enter image description here

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

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

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

Ответ 9

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

chown apache /var/log/httpd

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

Ответ 10

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

Ответ 11

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

Ответ 12

Способ, которым он работает на моем ubuntu (Apache 2.4.7, PHP 5.5.9), следующий:

Командная строка script:

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

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

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

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

Ответ 13

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

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 в каталоге регистрации, но это не сработало для меня.

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

Ответ 14

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

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

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

Ответ 15

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

display_errors = On

И попробуйте

 error_reporting(E_ALL);

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

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

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

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