Verzweifelnder: Runde Klammer in Kommentarzeile einer PHP .user.ini

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

  1. 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

    1. 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

      1. 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

        1. Hallo,

          Meine Frage ist somit beantwortet, merci!

          Meine aber nicht. Tritt der Effekt auch mit richtigem Kommentarzeichen auf?

          Gruß
          Kalk

          1. Sorry, das hatte ich überlesen.

            Ich habe jetzt alle # durch ; ersetzt und es kommt zu keinen Problemen mehr.

            Sprich, auch alle Direktiven nach einem Kommentar mit einer Klammer werden jetzt wie gewünscht erfüllt.

            LG

            Verzweifelnder

  2. 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

    --
    sumpsi - posui - obstruxi
    1. 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

      1. 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

        --
        sumpsi - posui - obstruxi
        1. 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.

        2. 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.