E_NOTICE per php.ini ausschließen im Error-Log
Ingo
- php
- programmiertechnik
Hallo
Ich habe meine Website bei Inos gehostet.
Bei Ionos gibt es einen Hilfe-Artikel, wo es um die PHP Error Logs geht: https://www.ionos.de/hilfe/hosting/problemloesungen-fuer-php/error-logs-aktivieren/
In meiner php.ini steht nun also auch: error_reporting = E_ALL | E_STRICT
Nun möchte ich das Logging von E_NOTICE aber gerne ausschließen. Das habe ich wie folgt versucht: error_reporting = E_ALL - E_NOTICE
Das scheint aber nicht zu funktionieren. Was mache ich falsch?
Könnt Ihr mir da vielleicht helfen? Das würde mich wirklich riesig freuen.
Gruß Ingo
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
In der php.ini willst Du also einen Integer notieren.
Das führt direkt zu:
<?=E_ALL-E_NOTICE;?>
Du suchst also die Zahl 32759, um diese in der PHP.ini einzutragen.
error_reporting = 32759; E_ALL & ~E_NOTICE
Erstmal vielen Dank für Deine schnelle Antwort. Das hatte ich so auch schon gefunden.
Was mich nur wundert, im PHP Handbuch ist die Schreibweise ja mit Klammern:
error_reporting(E_ALL & ~E_NOTICE);
Im Inonos-Artikel ist die Schreibweise aber ohne Klammern:
error_reporting = E_ALL | E_STRICT
Wie genau muss ich es denn in meine php.ini eintragen in der Schreibweise ohne Klammern?
Diese Syntax gilt in der php.ini:
error_reporting = 32759; Kommentar: E_ALL & ~E_NOTICE
im PHP-Skript kannst Du das individuell/temporär überschreiben:
error_reporting( 32759 ); # Kommentar: E_ALL & ~E_NOTICE
Alternativ (im Skript):
ini_set( 'error_reporting', 32759 );# Kommentar: E_ALL & ~E_NOTICE
Ah OK alles klar. Das müsste ich ja hinbekommen. Vielen lieben Dank.
Hallo Ingo,
der Unterschied ist:
In der PHP.INI notierst Du Konfigurationsoptionen im uralten INI Format. Es besteht aus Abschnitten, in denen Name-Wert Paare notiert werden. Zwischen Name und Wert steht ein Gleichheitszeichen. Die Abschnittsnamen werden von PHP allerdings stillschweigend ignoriert.
In deinem PHP Programm kannst Du die ini_set(name, wert)-Funktion aufrufen, mit der sich einige der Konfigurationsoptionen zur Laufzeit überschreiben lassen. Welche das sind, steht hier in der Spalte Changeable. Die Erklärung der Werte in dieser Spalte ist dort über der Liste verlinkt. Und jede der Optionen in der Liste ist ein Link zu ihrer Erklärung.
Die E_ Konstanten definieren einzelne Bits in den Fehlerbehandlungsoptionen. Beispielsweise ist E_ERROR=1, E_WARNING=2 oder E_NOTICE=8. Das sind alles Zweierpotenzen, außer E_ALL, das ist die Kombination aus allen anderen Werten.
Solche "Bitsammlungen" sind eine Speicherspartechnik aus der Urzeit der Programmierung. Man darf die einzelnen Werte nicht einfach addieren, das kann schiefgehen wenn man bspw. E_ALL und E_NOTICE addiert. Bei Bitsammlungen muss man mit & für "UND", | für "ODER" und ~ für "NICHT" arbeiten, d.h. um in einer Bitsammlung ein Bit zu setzen, verwendet man ODER:
$bits = $bits | E_WARNING;
Um es zu löschen, verwendet man UND NICHT:
$bits = $bits & ~E_WARNING;
Und man testet es mit UND
if ($bits & E_WARNING) {
// Warnungen sind eingeschaltet
}
Das ~ ist nicht das normale NICHT von PHP, das mit dem Ausrufezeichen gebildet wird. Das Ergebnis von ! ist immer boolean, d.h. true oder false, aber der ~ Operator bedeutet: invertiere jedes einzelne Bit in einer Zahl. Und genau das braucht man für Bit-Operationen.
Die E-Konstanten und die Operatoren &, | und ~ kannst Du in PHP verwenden und laut Handbuch auch in der PHP.INI - anders als Raketenwilli schrieb. Da hat er sich geirrt.
Man kann auch in der Apache-Konfiguration PHP Konfigurationsoptionen hinterlegen. Dort sind die E_-Konstanten nicht verwendbar, da brauchst Du den Zahlenwert. Um den zu erhalten, rechnest Du das entweder von Hand aus, oder Du schreibst Dir ein kleines PHP Script, das den Zahlenwert mit echo
ausgibt.
Rolf
Die E-Konstanten und die Operatoren &, | und ~ kannst Du in PHP verwenden und laut Handbuch auch in der PHP.INI - anders als Raketenwilli schrieb. Da hat er sich geirrt.
Nee :-)
Ich habe geschrieben „In der php.ini willst Du also einen Integer notieren.“ Nicht „musst”.
Grund: So vermeide ich immerhin eine Rechenoperation und Verwirrung darüber, was wo geht. Ich weiß: Das ist (jeweils) ein sehr kleiner Tropfen auf einem sehr heißen Stein.
Hallo Raketenwilli,
den Integer will ich definitiv nicht notieren, wenn ich E_-Konstanten verwenden darf.
Ich bezog mich auch eher auf dieses Posting, wo der Zahlenteufel tobt und wo man der Rolf den Eindruck bekommt, in der php.ini ginge es nicht anders…
Rolf
Hello,
Die E-Konstanten und die Operatoren &, | und ~ kannst Du in PHP verwenden und laut Handbuch auch in der PHP.INI - anders als Raketenwilli schrieb. Da hat er sich geirrt.
Ich habe geschrieben „In der php.ini willst Du also einen Integer notieren.“ Nicht „musst”.
Und in den Virual Hosts musst Du noch die Integer-Werte benutzen, oder haben Apache und PHP das inzwischen gemeinsam nachgearbeitet?
Ich persönlich würde daher immer die Integer-Werte benutzen, weil die immerfunktionieren und mir dahinter als Kommentar vermerken, was sie zu bedeuten haben ;-P
Glück Auf
Tom vom Berg
oder haben Apache und PHP das inzwischen gemeinsam nachgearbeitet?
Warum sollte der Apache just PHP-Konstanten kennen (besonders wenn PHP als CGI oder FPM läuft?) Freilich könnte man Bockstürze machen (es gibt ja auf modernen System die Datei /etc/apache2/envvars) - aber wenn man weiß, dass man die Zahlen einfach mit + und - ermitteln kann, dann sollte man DAS doch als „Admin“ hinbekommen.
Hello,
oder haben Apache und PHP das inzwischen gemeinsam nachgearbeitet?
Warum sollte der Apache just PHP-Konstanten kennen (besonders wenn PHP als CGI oder FPM läuft?) Freilich könnte man Bockstürze machen (es gibt ja auf modernen System die Datei /etc/apache2/envvars) - aber wenn man weiß, dass man die Zahlen einfach mit + und - ermitteln kann, dann sollte man DAS doch als „Admin“ hinbekommen.
Deshalb ;-)
Rückgriffe auf übergeordnete Schichten sind i.d.R. im Sinne der Programmsicherheit unerlaubt. Das Gegentgeil davon siehr man in der Angreifbarkeit von Windows-Programmen ...
Ist vermutlich kein Zufall, dass Linux-Systeme seltener oder gar nicht durch App-Reverse-Attacks attackiert werden können.
Glück Auf
Tom vom Berg
Hello,
Ich habe meine Website bei Inos gehostet.
Bei Ionos gibt es einen Hilfe-Artikel, wo es um die PHP Error Logs geht: https://www.ionos.de/hilfe/hosting/problemloesungen-fuer-php/error-logs-aktivieren/
In meiner php.ini steht nun also auch: error_reporting = E_ALL | E_STRICT
Nun möchte ich das Logging von E_NOTICE aber gerne ausschließen.
Und genau das solltest Du nicht generell tun, sondern nur für die entsprechenden Webseiten nach Fertigstellung™ das display_errors
so konfigurieren, dass die Fehlermeldungen nur noch in der Log-Datei landen.
Solange dort aber noch Notices landen, ist deine Webseite nicht fertig, sondern enthält Code von faulen, schlampigen, ignoranten oder sogar bösen Programmierern. Da ich Dich aber keinesfalls dazu zähle, solltest Du die Notices (ins Log) nicht abschalten, sondern regelmäßig kontrollieren!
Glück Auf
Tom vom Berg