web-dev-qa-db-ger.com

php error_log funktioniert nicht

Dies wurde 1000 Mal gefragt und ich habe die verschiedenen Beiträge vor dem Posten durchgesehen, aber keine Antwort gefunden. So lange ich mit PHP programmiert habe, war dies immer ein Albtraum, um arbeiten zu können. Kann mir bitte jemand sagen, was ich hier falsch mache?

Ich habe error_log zusammen mit error_reporting = E_ALL | in der INI-Datei gesetzt E_STRICT

Was fehlt mir noch? Das gab es normalerweise für mich. Ich möchte dieses Set in der Ini-Datei und nicht in meinen Skripten.

Eine andere interessante Sache ist, dass, wenn ich absichtlich versuche, einen Fehler in einem meiner Skripte zu werfen, Apache immer wieder neu startet.


Dies ist mein Ereignisprotokoll nach einem Fehler. Beute zum Zeitstempel

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.
22
Jim

Sie müssen auch log_errors = On in php.ini einstellen.

9
chaos

Falls jemand Probleme hat, die lokale Entwicklungsumgebung zum Protokollieren von Fehlern zu verwenden, haben Sie Folgendes behoben:

Unter Windows muss error_log auf den vollständigen Pfad zum Protokoll gesetzt werden, damit error_log() funktioniert (error_log = c:\Apache\php_errors.log). Wenn jedoch error_log = php_errors.log ohne Pfad vorhanden ist, kann php dennoch Startfehler wie z. B. protokollieren

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

Das Problem, auf das ich stieß, war, dass das von mir angegebene Fehlerprotokoll schreibgeschützt war. Alle meine .htaccess-Einstellungen waren korrekt. PHP konnte einfach nicht in das Fehlerprotokoll schreiben, da es keine Berechtigungen hatte. Das hat es für mich richtig gemacht:

chmod 777 watermellon-app-errors.log

Offensichtlich möchten Sie das .log in die Datei ändern, die Sie für ein Protokoll verwenden. 

7
Thomas Keene

Prüfen Sie, ob PHP-FPM error_log nicht explizit setzt:

Stellen Sie sicher, dass die Datei /etc/php-fpm.d/www.conf keine php_admin_value-Einstellungen für error_log enthält. Suchen Sie nach den folgenden Informationen und kommentieren Sie sie mit einem Semikolon aus:

; 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

Dann starte php-fpm neu:

systemctl restart php-fpm

Überprüfen Sie, ob die .htaccess-Dateien von Apache den error_log-Wert nicht mit festlegen

php_admin_value-Einstellungen in Apache-Konfigurationsdateien können nicht überschrieben werden. Stellen Sie daher sicher, dass Sie keinen php_admin_value für die error_log-Einstellung in den Apache-Konfigurationsdateien haben. Überprüfen Sie auch für den Fall php_value die Einstellungen.

PHP Website - So ändern Sie Konfigurationseinstellungen

4
Basil Musa

Wenn die error_log-Direktive gesetzt ist, wird die Datei zum Aufzeichnen von PHP-Fehlern verwendet. Wenn keine Fehler gesetzt sind, werden Fehler im Apache-Protokoll protokolliert. Werfen Sie einen Blick auf http://de3.php.net/manual/de/errorfunc.configuration.php#ini.error-log .

Die error_log-Datei und das Verzeichnis, in dem sie sich befinden, müssen für den Benutzer beschreibbar sein, unter dem Apache ausgeführt wird. Wenn die Datei nicht erstellt wird, liegt dies wahrscheinlich an einem Berechtigungsproblem.

Ich weiß nicht genau, warum Apache auf dich abstürzt, aber ich vermute, es handelt sich um eine Art Berechtigungsfrage.

4
bradym

Ich verstehe nicht warum , aber das Fehlerprotokoll funktioniert jetzt. Hier ist was ich getan habe. Ich habe die error_log-Direktive aufgegeben und kommentiert und die INI-Datei geschlossen. Ich habe das Skript mit dem Parser-Fehler ausgeführt, um zu sehen, dass Apache immer noch abstürzt, und ich habe den PHP-Fehler in der Protokolldatei erhalten. Dies ist verrückt, weil in der INI-Datei error_log nicht mehr aktiviert ist und mein Skript ini_set () nicht verwendet.

Hat jemand eine Erklärung für diesen Wahnsinn? Außerdem stürzt Apache nicht mehr ab.

1
Jim

In meinem Fall wurde auf einem CentOS-Entwicklungsserver nach einem vollständigen yum update die Berechtigung für/var/log/http auf 700 und der Benutzer auf 'root' geändert, sodass der Benutzer 'Apache' nicht konnte eingeben oder hineinschreiben Es konnte immer noch in die vorhandene Datei /var/log/httpd/error.log geschrieben werden, aber es konnte keine neue Datei erstellt werden, da ich Protokolldateien mit Datumsuffixe verwende. Den Befehl ausgeben

chown Apache /var/log/httpd

problem gelöst.

1
Zoltan M

Wenn Sie Fedora verwenden, verhindert SELinux (standardmäßig aktiviert), dass Apache/httpd Fehler an Ihre Protokolldatei anfügt, auch wenn Ihre Datei in der php.ini angegeben ist und das zugehörige Verzeichnis alle Berechtigungen hat. 

Sie können dies überprüfen, indem Sie Ihre Systemprotokolldatei in/var/log/messages betrachten.

enter image description here

Die ideale Lösung ist die Konfiguration von SELinux, um den Zugriff auf die Protokolldatei zu ermöglichen. 

Die schnellere Lösung besteht darin, SELinux in/etc/selinux/config zu deaktivieren, indem SELINUX auf deaktiviert gesetzt wird. 

Sie müssen Ihr System danach neu starten, damit die Änderung wirksam wird. 

1
Anthony

Auf meinem Ubuntu (Apache 2.4.7, PHP 5.5.9) funktioniert es folgendermaßen:

befehlszeilen-Skript:

  • schreibt das Protokoll in den Pfad, der auf error_log steht, wenn log_errors = On. Einstellungen in /etc/php5/cli/php.ini;

webanfrage über Apache:

  • wenn log_errors = On (/etc/php5/Apache2/php.ini), wurde der Fehler an den Pfad angehängt, auf den die ErrorLog Apache-Direktive im virtuellen Host verweist. Wenn diese Direktive nicht vorhanden ist, wird der Pfad der php.ini error_log verwendet.
  • wenn log_errors = Off keine Protokolle irgendwo geschrieben werden;

Soweit ich mich erinnere, funktionierte es in den meisten Linux-Stacks fast so

0
Elvis Ciotti

Wie Brady sagte, prüfen Sie, ob Sie über Schreibrechte für das Verzeichnis verfügen, in dem sich das PHP-Fehlerprotokoll für den Apache-Benutzer befindet. Wenn Sie eine Protokolldatei mit schriftlichen Berechtigungen erstellt haben, reicht es nicht aus, das Verzeichnis sollte sie auch haben.

0

Zum weiteren Debuggen: phpinfo();

Zeigt an, dass die aktuelle error_log-Einstellung hilfreich sein kann, wenn ein vhost nicht protokolliert.

Bin hier gelandet, nachdem diese Einstellung von php.ini und dem vhost überschrieben wurde. Wurde am Ende in Syslog protokolliert.

0
themullet

Hier ist meine Anleitung zur Fehlerbehebung für error_log()-Aufrufe, die nicht funktionieren.

  1. Sehen Sie sich die Konfiguration Ihres Servers an , um herauszufinden, wo sich die Standardfehlerprotokolldatei befindet.

    Dies hängt davon ab, welchen Server Sie verwenden. Sehen Sie sich zunächst Apache's ErrorLogOption an, wenn Sie Apache verwenden, oder Nginxs error_log Option , wenn Sie Nginx verwenden. Stellen Sie sicher, dass es sich um eine Datei handelt. Wenn Sie ein Tool wie Valet verwenden, beachten Sie, dass im Hintergrund Server-Software wie Nginx verwendet wird.

  2. Überprüfen Sie die Berechtigungen der Fehlerprotokolldatei Ihres Servers .

    Auf Unix-ähnlichen Systemen sollte es für den richtigen Benutzer und die richtige Gruppe schreibbar sein, und die Berechtigungen des übergeordneten Verzeichnisses und aller seiner Vorfahren müssen ebenfalls korrekt sein. Verwenden Sie chmodund chownname__.

  3. Überprüfen Sie die Konfiguration von PHP in den .ini-Dateien .

    Suchen Sie insbesondere nach log_errors = On und error_reporting = E_ALL | E_STRICT und error_log = /tmp/example/php_errors.log (siehe Dokumentation für Konfigurationseinstellungen log_errors , error_reporting und error_log ). Die .ini-Datei finden Sie in der Ausgabe von phpinfo();. Wenn error_log nicht festgelegt ist, wird standardmäßig das Fehlerprotokoll für den Server verwendet, das in den vorherigen Schritten erwähnt wurde. Wenn error_log auf eine Datei festgelegt ist, sollte sie bereits vorhanden und schreibbar sein, genau wie in den vorherigen Schritten. Denken Sie daran, den Server nach den Konfigurationsänderungen neu zu starten.

  4. Vergewissern Sie sich, dass PHP-Einstellungen nicht durch die Serverkonfiguration geändert werden .

    Die Konfiguration Ihres Servers (auch .htaccess) kann die Konfigurationseinstellungen von PHP ändern. In Apache erfolgt dies mit php_admin_value und php_admin_flag ( docs ). In Ihrer .htaccess-Datei finden Sie beispielsweise folgende Zeile: php_admin_flag[log_errors] = off. Denken Sie daran, den Server nach den Konfigurationsänderungen neu zu starten.

    An diesem Punkt sollten Sie in der Lage sein, eine Testdatei test.php mit dem Inhalt <?php error_log("test"); zu erstellen, den Server neu zu starten und die URL in Ihrem Browser zu öffnen. In Ihrem Fehlerprotokoll (testname__) (entweder im Serverprotokoll oder im eine, die durch error_log =) angegeben wird. Aber lesen Sie weiter.

  5. Stellen Sie sicher, dass PHP-Einstellungen zur Laufzeit nicht geändert werden .

    Die log_errors-Option kann zur Laufzeit geändert werden, indem ini_set('log_errors', 1); ausgeführt wird. Dies gilt auch für die anderen Konfigurationsoptionen error_reporting und error_log. Beachten Sie auch, dass es eine spezielle error_reporting() PHP function gibt, die die Konfiguration zur Laufzeit ändert. Durchsuchen Sie Ihre Code-Basis nach Aufrufen von ini_set oder error_reporting. WordPress zum Beispiel führt diese abhängig vom Wert von WP_DEBUG aus.

Andere Dinge, die Sie beachten sollten: Möglicherweise haben Sie Berechtigungsprobleme in SELinux (siehe diese Antwort ).

0
Flimm

Das error_log = "C:\php\Log\error.log" funktionierte bei mir ebenfalls nicht. Die Lösung für mich war, dass Sie das error.log nicht selbst erstellen sollten, da PHP dies für Sie erledigen wird. Siehe das PHP Message Board. Ich verwende PHP 5.2 auf einem Windows 2008-Server

0
Cerveser

Das hat den Trick für mich gemacht. 

setsebool -P httpd_unified 1

Bitte beachten Sie, dass dies die bevorzugte Methode ist, um es zuerst zu versuchen:

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

Diese Antwort wurde aus den Protokollen der folgenden Befehlszeile abgeleitet:

journalctl -xe 

Weitere Informationen zu dem System, auf dem ich ausgeführt wurde: PHP 7.0 und CentOS 7

Nicht sicher, ob es nicht offensichtlich ist, aber das Problem war die Konfiguration von Apache für das Schreiben von Dateien. Ich habe es mit chmod 777 versucht, chmod a + w im Protokollverzeichnis, aber das hat bei mir nicht funktioniert. 

Hoffe das kann jemandem helfen.

0
fungusanthrax