Hans-Otto: PHP-Counter als png-Datei und mysqli-Befehlen statt mysql

hi,

auf meiner Website habe ich einen Counter als PNG-Datei eingebunden. In dieser Datei befindet sich ein PHP-Script, das mit mysql-Befehlen auf die Counter-Datenbank zugreift (die PNG-Datei wird ihrerseits von den .htm- und php-Dateien der Website als Pseudo-Grafik eingebunden).

Über den Befehl in der .htaccess

AddType application/x-httpd-php .png

wird die PNG-Datei als PHP ausgeführt. Das funktioniert jetzt immer noch einwandfrei.

Wenn ich aber die mysql-Anweisungen durch mysqli ersetze, erscheint beim Aufruf der PNG-Datei (zumindest im Testmodus ohne header- und image-Befehle) die Fehlermeldung:

Fatal error: Call to undefined function: mysqli_connect()...

Wird die png-Datei mit den neuen mysqli-Befehlen aber in .php umgenannt und aufgerufen, klappt es dagegen einwandfrei. Im Prinzip funktioniert es aber auch mit einer anderen Anweisung in der .htaccess, also statt dem "Addtype..." dann "RewriteRule counter.png$ counter.php".

Mich interessiert aber, warum beim Aufruf der Counter-Datei mit .png und den neueren mysqli-Anweisungen die Fehlermeldung erscheint (so als ob in der php.ini die mySQLi-Erweiterung nicht eingebunden wäre), doch bei Verwendung der älteren mysql-Befehle kein Fehler erzeugt wird.

Müsste hier irgendwas in der php.ini eingetragen werden in Bezug auf die png-Endung? Ich hätte die Möglichkeit, eine eigene php.ini anzulegen.

Auf der Website läuft PHP 5.5.

Danke im voraus für die hoffentlich hilfreichen Antworten.

ciao
h-o

  1. Mahlzeit,

    hi,

    auf meiner Website habe ich einen Counter als PNG-Datei eingebunden. In dieser Datei befindet sich ein PHP-Script, das mit mysql-Befehlen auf die Counter-Datenbank zugreift (die PNG-Datei wird ihrerseits von den .htm- und php-Dateien der Website als Pseudo-Grafik eingebunden).

    Über den Befehl in der .htaccess

    AddType application/x-httpd-php .png

    wird die PNG-Datei als PHP ausgeführt. Das funktioniert jetzt immer noch einwandfrei.

    Und wozu jagst du nun jedes .png durch den PHP-Parser? Wieso rufst du das bild nicht mit

    <img src="image.png.php" />

    auf?

    Mich interessiert aber, warum beim Aufruf der Counter-Datei mit .png und den neueren mysqli-Anweisungen die Fehlermeldung erscheint (so als ob in der php.ini die mySQLi-Erweiterung nicht eingebunden wäre), doch bei Verwendung der älteren mysql-Befehle kein Fehler erzeugt wird.

    Schön. Du bist auch der Einzige, der das rausfinden kann. Dafür gibt es Logdateien, die über Fehler Auskunft geben.

    Müsste hier irgendwas in der php.ini eingetragen werden in Bezug auf die png-Endung? Ich hätte die Möglichkeit, eine eigene php.ini anzulegen.

    Nein, du sollst gar keine Bilder durch den Parser jagen.

    Danke im voraus für die hoffentlich hilfreichen Antworten.

    Dazu wären wesentlich mehr Infos nötig. Einmal der relevante Code zur Bilderzeugung und dann die Meldungen im error.log

    --
    42
  2. einen Counter als PNG-Datei eingebunden. In dieser Datei befindet sich ein PHP-Script

    Über den Befehl in der .htaccess

    AddType application/x-httpd-php .png

    wird die PNG-Datei als PHP ausgeführt. Das funktioniert jetzt immer noch einwandfrei.

    Das funktioniert vielleicht, ist aber nicht sonderlich schlau, weil du damit alle Dateien vom Typ PNG an PHP übergibst. Du verbrätst unnötig Rechenleistung auf dem Server, weil PHP jedes Bild durchsucht, Du verbrätst Bandbreite netzwerkseitig, weil Du verhinderst, dass Server und Browser nur noch dann sämtliche Bilddaten austauschen, wenn sich die Bilddateien geändert haben, und zu allem Überfluss dürftest du auch noch sämtliche PNG-Bilder als text/html ausliefern, weil das der Standardtyp ist, den PHP an den Browser meldet.

    Und das alles für eine Maßnahme rein kosmetischer Natur. Wenn's unbedingt sein muss, lege deine Zuweisung in einen <files>- oder <location>-Block (und verwende bitte SetHandler, siehe unten).

    Wenn ich aber die mysql-Anweisungen durch mysqli ersetze, erscheint beim Aufruf der PNG-Datei (zumindest im Testmodus ohne header- und image-Befehle) die Fehlermeldung:

    Fatal error: Call to undefined function: mysqli_connect()...

    Wird die png-Datei mit den neuen mysqli-Befehlen aber in .php umgenannt und aufgerufen, klappt es dagegen einwandfrei.

    Auf der Website läuft PHP 5.5.

    Sicher? Ersetze deinen Zählonkel mal durch <?php phpinfo(); ?> und vergleiche die Ausgabe der .png-URL mit jener der .php-URL.

    Üblicherweise wird PHP nicht mit AddType eingebunden, sondern mit SetHandler (siehe PHP-Installationsanleitung, dort Punkt 15). Eventuell bindest du mit der AddType-Zeile eine ältere PHP-Version ein. Es gibt Server, die sowohl PHP 4 als auch PHP 5 unterstützen.

    1. hi, akan.

      Das funktioniert vielleicht, ist aber nicht sonderlich schlau, weil du damit alle Dateien vom Typ PNG an PHP übergibst.

      Nein, zur Beruhigung: der Counter liegt in einem Unterverzeichnis /images/counter/ (als einzige png-Datei). Und nur dort befindet sich die .htaccess-Datei (und auch keine weiteren Unterverzeichnisse darunter, die diese Anweisung vererben könnten). Das heißt, nur in diesem Verzeichnis wird eine PNG-Datei als PHP interpretiert.

      Dort deswegen, weil dieses Unterverzeichnis auch mit robots.txt ausgeschlossen ist und somit zumindest die größeren Suchmaschinen, die sich mehr oder weniger an die robots-Informationen halten, nicht durch Aufruf der PNG-Datei das Ergebnis wesentlich verfälschen (ganz verhindern kann man das sicher nicht, aber eine Suchmaschine ist eher an Dateien mit .php interessiert (selbst wenn diese in einem ausgeschlossenen Verzeichnis liegen) statt an "vermeindlichen" Grafikdateien mit .png. Daher hab ich diese Variante mit counter.png statt mit counter.php gewählt).

      Auf der Website läuft PHP 5.5.
      Sicher?

      Ja, ich war mir sicher :-)

      Zumindest beim Aufruf normaler PHP-Dateien, die sich nicht in diesem Unterverzeichnis befanden. Aber...

      Ersetze deinen Zählonkel mal durch <?php phpinfo(); ?> und vergleiche die Ausgabe der .png-URL mit jener der .php-URL.

      ...tja, tatsächlich wird jetzt PHP 4.4.9 ausgegeben. Und von mysqli fehlt dann natürlich jede Spur.

      Üblicherweise wird PHP nicht mit AddType eingebunden, sondern mit SetHandler

      Also nach vielem Ausprobieren hängt es wohl damit zusammen, dass für .png-Dateien auf jeden Fall die Versionsnummer in der Anweisung angegeben werden muss. Es klappt nun sowohl mit

      AddType application/x-httpd-php55 .png

      als auch mit

      AddHandler application/x-httpd-php55 .png

      oder mit dem von dir erwähnten

      <FilesMatch .png$>
          SetHandler application/x-httpd-php55
        </FilesMatch>

      Doch ohne Angabe der Version hinter dem x-httpd-php wird mit allen drei oben erwähnten Anweisungen immer nur der Interpreter von PHP 4.4.9 für .png-Dateien gestartet (statt 5.5 bei "normalen" .php-Dateien).

      Und wenn ich (aus Spaß) das Ganze probiere mit

      AddType/AddHandler/Sethandler... application/x-httpd-php5 .png .php

      dann wird für .png-Dateien der PHP-Interpreter 5.326 in Gang gesetzt und für .php die Version 5.5.

      Da mir das zu unsicher ist, scheint mir die (versionsunabhängige) Variante mit RewriteRule die beste Lösung zu sein.

      Trotzdem herzlichen Dank, denn du hast den entscheidenden Tipp gegeben. Schön, dass es dieses Forum immer noch gibt :-)

      ciao
      h-o

      1. der Counter liegt in einem Unterverzeichnis /images/counter/ (als einzige png-Datei)

        Doch ohne Angabe der Version hinter dem x-httpd-php wird mit allen drei oben erwähnten Anweisungen immer nur der Interpreter von PHP 4.4.9 für .png-Dateien gestartet (statt 5.5 bei "normalen" .php-Dateien).

        Da mir das zu unsicher ist, scheint mir die (versionsunabhängige) Variante mit RewriteRule die beste Lösung zu sein.

        Da du den Zähler sowieso in einem eigenen Verzeichnis hast, benenne ihn doch in index.php um und rufe ihn mit /images/counter/ auf statt images/counter/counter.png (was eh schon in sich etwas redundant ist). Das ist IMHO die einfachste Lösung – die Übergabe an die jeweilige Standard-PHP-Version, eine kurze URL und das pöse™ .php ist auch nicht zu sehen.