Mike: include oder readfile nur Browseroutput ohne url

Hallo,

manchmal nutze ich include oder readfile um die Browserausgabe einer anderen Datei zu erhalten. Das geht auf dem gleichen Server/Verzeichnis normalerweise nur, wenn ich keine lokale Pfadangabe verwende, sondern komplett die URL dortdhin also mit http://...

Nun frage ich mich ob das die einzige Möglichkeit ist und überhaupt verlässlich, könnte ja mal sein dass der Server das anders interpretiert und schon liegt der komplette Quellcode offen.

Gibt es Alternativen?

Mike

  1. Tach!

    manchmal nutze ich include oder readfile um die Browserausgabe einer anderen Datei zu erhalten.

    include interpretiert PHP-Code. Wenn du das nicht beabsichtigst, ist include falsch verwendet. readfile() hingegen reicht nur durch, was es bekommt.

    Das geht auf dem gleichen Server/Verzeichnis normalerweise nur, wenn ich keine lokale Pfadangabe verwende, sondern komplett die URL dortdhin also mit http://...

    Da kommt die Wrapper-Funktionalität von PHP zum Einsatz. Wenn du ein Schema (wie http://) voranstellst, dann findet kein Dateisystemzugriff statt sondern die Aktion, die dem Schema zugeordnet ist. Bei http:// ist es ein Web-Request.

    Nun frage ich mich ob das die einzige Möglichkeit ist

    Für welches Ziel genau? PHP-Code interpretiert zu bekommen? Ist ein include über das Dateisystem und die direkte Interpretation keine Option?

    und überhaupt verlässlich, könnte ja mal sein dass der Server das anders interpretiert und schon liegt der komplette Quellcode offen.

    Ein Server kann immer fehlkonfiguriert sein und PHP-Code unverarbeitet durchreichen. Es ist dabei nicht weiter von Belang ob er dann Wrapper- oder Browser-Requests bedient.

    dedlfix.

    1. Hallo,

      include interpretiert PHP-Code. Wenn du das nicht beabsichtigst, ist include falsch verwendet. readfile() hingegen reicht nur durch, was es bekommt.

      Interpretiert PHP-Code, ja wenn vorhanden.

      Für welches Ziel genau? PHP-Code interpretiert zu bekommen? Ist ein include über das Dateisystem und die direkte Interpretation keine Option?

      Manchmal nicht, es bietet sich aber auch Ajax oder Iframe an oder eben die Einbindung. Das macht manche Projekte wesentlich modularer und übersichtlicher. Nein ich möchte keine Interpretierung, sondern den Output, wie er im Browser-Quelltext erscheinen würde.

      Ein Server kann immer fehlkonfiguriert sein und PHP-Code unverarbeitet durchreichen. Es ist dabei nicht weiter von Belang ob er dann Wrapper- oder Browser-Requests bedient.

      Also bin ich mit der http:// Angabe im Grunde auf der sicheren Seite? Hatte gehofft sowas zu finden wie ein Funktionsparameter, zb. *fiktiv file_get_contents('datei.php','OPEN NOT BY FILESYSTEM')

      Gruß
      (* hätte man nicht bei der Rechtschreibreform ß komplett eliminieren und wenn sie schon dabei gewesen "wären", ebenso alle Umlaute ;-)
      Btw. Türkisch und Schwedisch ohne Umlaute klingt auch besser ;-)

      Mike

      1. Tach!

        Für welches Ziel genau? PHP-Code interpretiert zu bekommen? Ist ein include über das Dateisystem und die direkte Interpretation keine Option?
        Manchmal nicht, es bietet sich aber auch Ajax oder Iframe an oder eben die Einbindung. Das macht manche Projekte wesentlich modularer und übersichtlicher. Nein ich möchte keine Interpretierung, sondern den Output, wie er im Browser-Quelltext erscheinen würde.

        Wenn du keine Interpretation eines Dateininhalts möchtest, dann lies sie direkt über das Dateisystem ein. Wenn du ein Script aufgeführt haben möchtest, um dessen Ausgabe irgendwo einzubinden, warum rufst du dann den die Ausgabe erzeugenden Code nicht direkt auf, sondern macht noch einen extra Request. Ist dein Server zu schnell, das du ihn unbedingt mit Prozesswechseln beschäftigen musst?

        Ein Server kann immer fehlkonfiguriert sein und PHP-Code unverarbeitet durchreichen. Es ist dabei nicht weiter von Belang ob er dann Wrapper- oder Browser-Requests bedient.
        Also bin ich mit der http:// Angabe im Grunde auf der sicheren Seite? Hatte gehofft sowas zu finden wie ein Funktionsparameter, zb. *fiktiv file_get_contents('datei.php','OPEN NOT BY FILESYSTEM')

        http:// macht immer einen HTTP-Request. Nur der den Request verarbeitende Webserver ist in der Lage, die URL zu einer Datei oder einem Script aufzulösen. In PHP ist nicht vorgesehen, herauszufinden ob das zufällig am Ende im eigenen Dateisystem landet.

        dedlfix.

        1. Hallo,

          Wenn du keine Interpretation eines Dateininhalts möchtest, dann lies sie direkt über das Dateisystem ein. Wenn du ein Script aufgeführt haben möchtest, um dessen Ausgabe irgendwo einzubinden, warum rufst du dann den die Ausgabe erzeugenden Code nicht direkt auf, sondern macht noch einen extra Request. Ist dein Server zu schnell, das du ihn unbedingt mit Prozesswechseln beschäftigen musst?

          nein, es soll zwar interpretiert werden, aber nicht in der Basisdatei. Ich versuchs mal zu erklären:

          basis-seite_1 bezieht Content von modul-seite_1 (generiert durch PHP und/oder JS). Diese modul-seite_1 widerum bezieht einige Routinen aus anderen Elternmodulen.

          Das bedeutet die Module sind komplett autark und sehr intuitiv in der Bedienung. Würde ich die Ausgabe auf basis-seiten erzeugen wird das Ganze schnell unübersichtlich. Aber wer weiß, vielleicht denke ich auch nur zu kompliziert, dann gib mir einen Hinweis;-)

          In diesem Zusammenhang...
          wie schnell man doch einfachste Sachen vergessen kann und dann neue Fragen enstehen:

          file_get_contens('http://domain.xy/index.php?q=das ist ein beispiel') mit einer URL, die Leerzeichen enthält muss natürlich encoded werden. War so in Gedanken, dass mir gar nicht auffiel, dass ich die ganze URL behandelt habe und kam einfach nicht dahinter. Kurzer Blick, weil Fehler anderswo vermutet, ins Manual, dort steht wie gewohnt:

          "Falls Sie einen URI mit speziellen Zeichen, wie z.B. Leerzeichen, öffnen, müssen den URI mittels urlencode() enkodieren."

          Ja wie jetzt, habe ich doch, dachte ich noch, bis mir einfiel nur die get-parameter zu encoden. Da frage ich mich natürlich woher ein Anfänger das wissen soll? Aber egal, sobald mich mal ein Thema interessiert, schau ich was es da sonst noch so gibt und ich fand diesen thread hier, aus dem ich nicht richtig schlau werde. Da wird immer auf rawurlencode hingewiesen, was bei so einer URL jedoch nicht funktionieren kann (nur +zeichen) und auch so kann ich da irgendwie kein richtiges Fazit herauslesen.

          Noch ein letztes: Ist es theoretisch eigentlich möglich eine encodefunktion zu erstellen, der man die komplette URL übergeben kann. Ich versuche das zwar gerade aber da theoretisch alles als get-parameter in Frage kommt und auch der Vielzahl von möglichen Dateinamen/Domains möglich sind, fällt mir keine Lösung ein.

          Gruss
          Mike

          1. Tach!

            basis-seite_1 bezieht Content von modul-seite_1 (generiert durch PHP und/oder JS). Diese modul-seite_1 widerum bezieht einige Routinen aus anderen Elternmodulen.
            Das bedeutet die Module sind komplett autark und sehr intuitiv in der Bedienung. Würde ich die Ausgabe auf basis-seiten erzeugen wird das Ganze schnell unübersichtlich. Aber wer weiß, vielleicht denke ich auch nur zu kompliziert, dann gib mir einen Hinweis;-)

            Wenn du das, was deine Module machen, nebenwirkungsfrei geschrieben hast, dann sollte der direkte Aufruf des Moduls das gewünschte Ergebnis direkt liefern können. Nebenwirkungsfrei bedeutet, dass das Modul keine Funktionalitäten voraussetzt, die anderswo mit anderen, für das Modul nicht brauchbaren Parametern initialisiert wurden, und dass es keine Hinterlassenschaften hat, die andere Teile stören könnten. Wenn du immer alle Parameter übergibst, die benötigt werden, statt dass sich dein Code alles irgendwo selbst zusammenholt, ist schon ein Teil der Voraussetzugnen für Nebenwirkungsfreiheit gegeben.

            Kurzer Blick, [...] ins Manual, dort steht wie gewohnt:
            "Falls Sie einen URI mit speziellen Zeichen, wie z.B. Leerzeichen, öffnen, müssen den URI mittels urlencode() enkodieren."

            Der Satz ist sozusagen falsch, auch im englischen Original. Bei urlencode() und rawurlencode() steht, welche Teile der URL damit zu behandeln sind, wobei rawurlencode() auch problemlos für alle Teile verwendet werden kann. Auf keinen Fall ist die komplette URL zu behandeln, sondern nur die Teile, die Daten transportieren, also nicht die Trennzeichen dazwischen.

            Noch ein letztes: Ist es theoretisch eigentlich möglich eine encodefunktion zu erstellen, der man die komplette URL übergeben kann.

            Nein, diese Funktion müsste wissen, welche Zeichen du als Trennzeichen und welche als Nutzdaten gemeint hast. Sie müsste die URL in ihre Einzelteile zerlegen, um diese dann zu kodieren. Um die Einzelteile aber korrekt zu erkennen, müssen diese korrekt kodiert sein. Damit hast du sozusagen eine unauflösbare Rekursion.

            dedlfix.

            1. Hallo,

              Wenn du das, was deine Module machen, nebenwirkungsfrei geschrieben hast, dann sollte der direkte Aufruf des Moduls das gewünschte Ergebnis direkt liefern können. Nebenwirkungsfrei bedeutet, dass das Modul keine Funktionalitäten voraussetzt, die anderswo mit anderen, für das Modul nicht brauchbaren Parametern initialisiert wurden, und dass es keine Hinterlassenschaften hat, die andere Teile stören könnten. Wenn du immer alle Parameter übergibst, die benötigt werden, statt dass sich dein Code alles irgendwo selbst zusammenholt, ist schon ein Teil der Voraussetzugnen für Nebenwirkungsfreiheit gegeben.

              hmm, hört sich an als könnte ich was lernen. Ich werde deshalb in Kürze, sobald ich ein wenig Zeit habe, ein passendes Mini-Beispiel-Projekt auf meine Weise erstellen und wäre schön wenn Du das dann mal auf deine Weise anpassen könntest um den direkten Vergleich zu haben.

              Noch ein letztes: Ist es theoretisch eigentlich möglich eine encodefunktion zu erstellen, der man die komplette URL übergeben kann.
              Nein, ....Damit hast du sozusagen eine unauflösbare Rekursion.

              Dachte ich mir schon,
              danke
              Mike

      2. Hallo,

        Btw. Türkisch und Schwedisch ohne Umlaute klingt auch besser ;-)

        Trkisch kann ich nicht wirklich aussprechen und in Schwedisch finde ich kein Umlaut.

        scnr
        Kalk