Runde Klammer in Kommentarzeile einer PHP .user.ini
Verzweifelnder
- php
- webserver
Hallo!
Ich habe bei einer Testdomain festgestellt, dass eine bestimmte .user.ini für PHP nicht funktioniert und jetzt 3 Tage gebraucht, bis ich drauf gekommen bin, was der Auslöser dafür ist.
Folgende .user.ini funktioniert:
# Kommentar 1
display_errors = ON
display_startup_errors = ON
# Kommentar 2
log_errors = ON
# Kommentar 3
error_log = /verzeichnis_foo/verzeichnis_bar/php_error_logs.txt
Und folgende .user.ini funktioniert nicht:
# (Kommentar 1
display_errors = ON
display_startup_errors = ON
# Kommentar 2
log_errors = ON
# Kommentar 3
error_log = /verzeichnis_foo/verzeichnis_bar/php_error_logs.txt
Der einzige Unterschied ist die runde Klammer bei Kommentar 1. Ab dieser Stelle werden die Anweisungen nicht ausgeführt. Den Beweis, dass tatsächlich die Klammer der Grund dafür ist, bringt das Versetzen der Klammer in den Kommentar 3. Dann werden nämlich, wie man auch mit phpinfo() schön sehen kann, die display Anweisungen ausgeführt, nur das Protokollieren funktioniert dann nicht.
Und lösche ich dann die Klammer aus Kommentar 3, bin ich wieder beim obigen 1. Beispiel und alle Direktiven werden wie gewünscht umgesetzt.
Jetzt weiß ich zwar, was der Grund für das Problem war, nur das WARUM würde ich noch gerne klären.
Ich war der Meinung, dass ich mit dem Hashtag in einer .user.ini eine Kommentarzeile einfügen kann und es dann völlig egal is, was danach geschrieben seht, weil es übersprungen wird.
Ganz offensichtlich ist das aber nicht so. Kann mir jemand sagen, warum das so abläuft und wie das nun ist mit Kommentaren und diesem Phänomen?!
Danke im Voraus!
Der Verzweifelnde
Hallo,
Auf die eigentliche Frage hab ich keine Antwort, aber der hashtag ist doch das Kommentarzeichen für Apache-Inis und für PHP-Inis wäre es das Semikolon, oder?
Verschwindet der Effekt bei Nutzung des korrekten Zeichens?
Gruß
Kalk
Auf die eigentliche Frage hab ich keine Antwort, aber der hashtag ist doch das Kommentarzeichen für Apache-Inis und für PHP-Inis wäre es das Semikolon, oder?
Ist es definitiv und es steht sogar in der php.ini:
; The syntax of the file is extremely simple. Whitespace and lines
; beginning with a semicolon are silently ignore
Spenden für die Verteidigung Europas am Hindukusch in der Ukraine
Vielen Dank für die Info!
Witzig, dass alles ohne der Klammer nach einem Hashttag trotzdem ignoriert wird, so als wäre es die reguläre Kommentarform.
Gut, dann werde ich das entsprechend richtig stellen.
Meine Frage ist somit beantwortet, merci!
MfG
Verzweifelnder
Hallo,
Meine Frage ist somit beantwortet, merci!
Meine aber nicht. Tritt der Effekt auch mit richtigem Kommentarzeichen auf?
Gruß
Kalk
Hallo Verzweifelnder,
in der PHP.INI steht vorneweg eine Minianleitung. Unter anderem steht da:
; Expressions in the INI file are limited to bitwise operators and parentheses:
Das heißt: Klammern haben in in einer .ini Datei Bedeutung. Ein # Zeichen auch: es leitet nämlich einen RGB Farbcode ein (wozu, kannst Du in der .ini Datei selbst heraussuchen. Such nach #)
Eine Zeile wie
# (Huhu
kann den INI-Parser nur zum Qualmen bringen. Leider schmeißt er keine Fehlermeldungen, das wäre wirklich hilfreich.
Rolf
Leider schmeißt er (gemeint: Der ini-Parser von PHP) keine Fehlermeldungen, das wäre wirklich hilfreich.
Doch. Das tut er. Zumindest im Terminal.
.user.ini:
; Test
#(foo
; Test
;
Aufruf im Terminal
php -c .user.ini test.php
Nachricht im Terminal
syntax error, unexpected '(' in /path/to/.user.ini on line 2
# Ausgaben des Skriptes
# …
Allerdings beendet sich PHP mit Statuscode 0. Womöglich landet deshalb nichts im Error-Log.
Zweiter Test, um zu sehen, welche Fehler PHP ausgibt:
php -c .user.ini
PHP: syntax error, unexpected '(' in /path/to/.user.ini on line 2
Ich tippe:
<?=error_reporting();
[CTRL]+[D]
Ausgabe: 32767
32767? Kenne ich! Das ist der Wert der Konstante E_ALL
a.k.a. “Alle Fehler, Warnungen und Benachrichtigungen.“
Der einfachste Test der .user.ini in einer Konsole ist also:
echo "<?=error_reporting();" | php -c .user.ini; echo;
PHP: syntax error, unexpected '(' in /path/to/.user.ini on line 2
32767
Spenden für die Verteidigung Europas am Hindukusch in der Ukraine
Hallo Raketenwilli,
Doch. Das tut er. Zumindest im Terminal.
In meinem Terminal (a.k.a. Windows CMD.EXE) wird die .user.ini ignoriert - passend zur Doku, wonach eine .user.ini nur für das CGI/FCGI SAPI beachtet wird.
(...running off to google, binge and duck for more info)
Hast Du PHP_INI_SCAN_DIR=. gesetzt, damit es auf der Konsole eine .user.ini beachtet? Hätt ich auch mal tun sollen, das hätte mir viele Fragezeichen erspart. Im Browser sieht man's nicht.
Rolf
Hast Du PHP_INI_SCAN_DIR=. gesetzt, damit es auf der Konsole eine .user.ini beachtet?
Nein. Einfacher: php -c
erwingt, dass die danach genannte Datei als einzige ini genommen wird.
Hast Du PHP_INI_SCAN_DIR=. gesetzt, damit es auf der Konsole eine .user.ini beachtet?
export PHP_INI_SCAN_DIR=$TMPDIR
(Ich habe aus ${'arrWichtigeGründe'} ein weiteres tmp-Verzeichnis im User-Home. →¹)
Das einfache Setzen der Variable (unter Linux) reicht nicht. Erst als ich die Variable PHP_INI_SCAN_DIR
in die Umgebung exportiert habe wurde dort automatisch gesucht.
Dann allerdings sowohl mit dem Name .user.ini
als auch php.ini
¹)
1.) Die „netten“ Snaps von Ubuntu 22.04 dürfen aus unbekannten Gründen nicht auf /tmp zugreifen. Das ist ein Horror, wenn man z.B. mal schnell ein Bildschirmfoto temporär ablegen und via Browser hochladen will.
2.) Wenn man schon $HOME verschlüsselt ist, dann ist es einfach mal Mist wenn das nicht weniger private temporäre Zeug im Klartext auf der Platte herumliegt.
Die Lösung stelle ich gleich mal vor:
### (New) File: /etc/profile.d/02_tmpdir.sh
### Rechte: root root, 755
# Standard:
export TMPDIR="${HOME}/tmp/";
# Meine Typos:
export TEMPDIR="${HOME}/tmp/";
export TEMP="${HOME}/tmp/";
export TMP="${HOME}/tmp/";
# Verzeichnis leeren bzw. neu anlegen
# wenn dieses die einzige Sitzung
# des sich einloggenden Benutzers ist:
if [ 1 -eq $(/usr/bin/w | /usr/bin/grep "${USER}" | /usr/bin/wc -l) ]; then
rm -rf ${TMPDIR};
fi
if [ ! -d "${TMPDIR}" ]; then
/usr/bin/mkdir "${TMPDIR}";
fi
Und dann natürlich eine der obigen Variablen benutzen. ${TMPDIR}
ist übrigens die korrekte, die von Anwendungen erkannt und genutzt wird.