Kiska Kogtistaya: Ausgabe als PHP-Datei

Hallo,

Folgendes: ein cgi-Script erzeugt eine html-Seite mit
print "Content-Type: text/html\n\n" ;

Frage: wie kann ich dem Script beibringen, dass die Ausgabe in php erfolgen soll, d.h. dass nach Erzeugung des Inhaltes soll das ganze auch noch durch PHP auf dem Server laufen?

Meine Irrwege:
(1) Ich versuche (wie naiv!) die Zeile so abzuändern:
print "Content-Type: text/php\n\n" ;
Schlagt mich nicht. Das wäre logisch, aber es funkzioniert natürlich nicht.

(2) Dann öffne ich die PHP-Datei mit
$file = 'dateiname.php';
open (INFO, ">$file");
Passiert nix. Auch irgendwie logisch, aber was soll ich da noch eingeben?

(3) Ich schalte mein PC aus und gehe spazieren. Hat das Problem auch nicht gelöst.

Hilfe, bitte...

  1. Moin

    Frage: wie kann ich dem Script beibringen, dass die Ausgabe in php erfolgen soll, d.h. dass nach Erzeugung des Inhaltes soll das ganze auch noch durch PHP auf dem Server laufen?

    Du kannst nicht ohne weiteres dem Server beibringen dass er die Ausgabe eines Interpreters noch durch einen weiteren Interpreter jagen soll...

    print "Content-Type: text/php\n\n" ;

    Das geht dann so auch an den Browser. Der Server schaut sich die Header zwar an, aber ..siehe oben. Wenn der Browser zufällig einen PHP-Interpreter hat, könnte etwas ähnliches vielleicht sogar funktionieren. Aber irgendwie glaube ich nicht dass es so einen Browser gibt.

    $file = 'dateiname.php';
    open (INFO, ">$file");
    Passiert nix. Auch irgendwie logisch, aber was soll ich da noch eingeben?

    Hmm, schreibe alle deine Ausgaben in print INFO "blabla"; um und sende einen Location: dateiname.php-Header (zusammen mit dem richtigen Statuscode) an den Browser. Nicht schön, sollte aber funktionieren.

    Die richtige Lösung wäre mit open2 den PHP-Interpreter zu starten, ihm deine Skriptausgaben zu senden und anschließend das Ergebnis auszugeben, du brauchst dazu natürlich eine CGI-Version von PHP (kann ja auch zusätzlich zu einem evt. vorhandenen Modul installiert werden). Etwa so:

    #!/usr/bin/perl
    use IPC::Open2;
    $pid = open2(*Reader, *Writer, "/wo/auch/immer/das/liegt/php");

    $oldstdout = select(Writer);

    print "<?php phpinfo();?>";

    usw. usf.

    select($oldstdout);
    close(Writer);

    Kein print Content-Type, PHP sollte das für dich erledigen

    while(<Reader>) { print $_; }

    (Naja, so oder so ähnlich, ich kann eigentlich kein Perl)

    --
    Henryk Plötz
    Grüße aus Berlin

    1. Moin

      Moin auch

      Hört sich super kompliziert an, ich frage mal anders. Die Ausgaben aus einem cgi-script sollen in einer php-Datei geladen werden, da die letzte ein Template aus mehreren php-Dateien bildet.

      Natürlich kann ich das ganze in HTML umwandeln und unter
      print "Content-Type: text/html\n\n" ;
      reinstellen, das Problem dabei, ich habe keinen übergreifenden Template mehr, sondern muss die Ausgabe immer manuell im cgi-script anpassen, wenn php-Template sich ändert. Welche Lösungen gibt's da ansonsten?

      Vielen Dank für Deine Hilfe.
      Kiska

      1. Moin!

        Welche Lösungen gibt's da ansonsten?

        Ich würde die ganze Sache von PHP aus anpacken. PHP kann ja, sofern es erlaubt ist, auch andere Skripte und Programme auf dem Server starten und deren Ausgabe weiterverarbeiten (umgekehrt gehts genauso, aber ich würde den Komfort von PHP nicht unbedingt aufgeben wollen).

        PHP kennt die Funktion system() http://www.php.net/manual/de/function.system.php. Damit kannst du das CGI-Skript ausführen lassen. Es muß dabei natürlich keine komplette HTML-Seite mehr ausgeben, sondern nur noch die Informationen, die es ursprünglich generiert, und außerdem darf es nur HTML ausgeben - PHP-Code wird nicht (ohne weiteres) ausgeführt. Es dürfte einfacher sein, den dann in PHP direkt zu programmieren.

        - Sven Rautenberg

        1. Moin!

          Moin

          Ich würde die ganze Sache von PHP aus anpacken.
          PHP kennt die Funktion system() Damit kannst du das CGI-Skript ausführen lassen.

          Es hat geklappt, danke-danke-danke, wohl nicht mit system() aber mit
          virtual("cgi-bin/bla-bla.cgi");

          Ich wäre aber selber nicht darauf gekommen, Dein Link hat's getan!

          Das ist genau, was ich brauchte.
          Eine Knudeleinheit an Sven :)

          Kiska