Sumafu: file_get_contents mit get parameter geht nicht

Hey, ich werde hier gleich verrückt. Ich bin grade dabei ein kleines Script in PHP zu schreiben. Dabei kommt folgender Code drin vor:

$pingVerteiler = file_get_contents("ping.php?domain=blub");

Allerdings gibt mit PHP folgenden Fehler aus:

Warning: file_get_contents(ping.php?domain=blub): failed to open stream: No such file or directory in /ein/verzeichnis/datei.php on line 4

Die Datei existiert aber und wenn ich den GET-Parameter weg lasse, dann gibt es keinen Fehler. Und auf einem anderen Webserver gibt es auch mit GET-Parameter keine Fehler. Woran könnte es also liegen, dass es nicht funktioniert?

  1. Hey, ich werde hier gleich verrückt. Ich bin grade dabei ein kleines Script in PHP zu schreiben. Dabei kommt folgender Code drin vor:

    $pingVerteiler = file_get_contents("ping.php?domain=blub");
    

    Allerdings gibt mit PHP folgenden Fehler aus:

    Warning: file_get_contents(ping.php?domain=blub): failed to open stream: No such file or directory in /ein/verzeichnis/datei.php on line 4
    

    so, wie Du den Dateinamen angibst, müsste das zu ladende Script im selben Verzeichnis liegen, wie das aufrufende und müsste auch genau so heißen. Der Zugriff findet lokal über das Filesystem statt, nicht per http

    Grüße RS

    Die Datei existiert aber und wenn ich den GET-Parameter weg lasse, dann gibt es keinen Fehler. Und auf einem anderen Webserver gibt es auch mit GET-Parameter keine Fehler. Woran könnte es also liegen, dass es nicht funktioniert?

    1. so, wie Du den Dateinamen angibst, müsste das zu ladende Script im selben Verzeichnis liegen, wie das aufrufende und müsste auch genau so heißen. Der Zugriff findet lokal über das Filesystem statt, nicht per http

      Das soll ja so sein. Die Datei liegt auch im selben Verzeichnis. Und wenn ich die Zeile so abändere, geht es auch:

      $pingVerteiler = file_get_contents("ping.php");
      

      Und, wie gesagt, auf einem anderen Server geht es auch mit dem Parameter

      1. Hi,

        so, wie Du den Dateinamen angibst, müsste das zu ladende Script im selben Verzeichnis liegen, wie das aufrufende und müsste auch genau so heißen. Der Zugriff findet lokal über das Filesystem statt, nicht per http

        Das soll ja so sein. Die Datei liegt auch im selben Verzeichnis. Und wenn ich die Zeile so abändere, geht es auch:

        $pingVerteiler = file_get_contents("ping.php");
        

        Und, wie gesagt, auf einem anderen Server geht es auch mit dem Parameter

        Das kann ich mir nicht vorstellen.
        Vermutlich hast Du dort dann eine Datei mit genau dem Namen "ping.php?domain=blubb"?

        Ciao RS

        1. Das kann ich mir nicht vorstellen.
          Vermutlich hast Du dort dann eine Datei mit genau dem Namen "ping.php?domain=blubb"?

          Nein, habe ich nicht. Aber so langsam fange ich an zu verstehen. Auf dem anderen Server werden standardmäßig keine Fehler ausgegeben. Deswegen hat der restliche Code auch problemlos funktioniert. Und jetzt ist mir auch klar geworden, warum das gar nicht funktionieren kann und warum ihr gesagt habt, dass man das über http machen muss. Schande über mich. Ich werde das jetzt versuchen umzubauen.

          1. Ich habe jetzt ein Lösung gefunden, womit ich vorläufig weiterarbeiten kann. Dazu noch eine Frage: Gibt es eine einfache Möglichkeit, den Pfad zur aktuellen Datei auszulesen, relativ zum document-Root und ohne die Datei selbst? Also wenn ich im Browser "http://domain.de/ein/pfad/datei.php" aufrufe, dass ich dann "/ein/pfad/" bekomme? Ich könnte natürlich $_SEREVR["PHP_SELF"] nehmen und den Dateinamen rausschneiden, aber gibt es vielleicht eine einfacherere Möglichkeit?

            1. Hi,

              Ich habe jetzt ein Lösung gefunden, womit ich vorläufig weiterarbeiten kann. Dazu noch eine Frage: Gibt es eine einfache Möglichkeit, den Pfad zur aktuellen Datei auszulesen, relativ zum document-Root und ohne die Datei selbst? Also wenn ich im Browser "http://domain.de/ein/pfad/datei.php" aufrufe, dass ich dann "/ein/pfad/" bekomme? Ich könnte natürlich $_SEREVR["PHP_SELF"] nehmen und den Dateinamen rausschneiden, aber gibt es vielleicht eine einfacherere Möglichkeit?

              Besser $_SERVER['SCRIPT_NAME']

              Oder Du nimmst dirname() und ziehst vorne $_SERVER['DOCUMENT_ROOT'] ab, indem du einfach strlen() von DOCROOT vorne abschneidest und prüfst, ab das abgeschnittene Stück mit DOCROOT übereinstimmt

              Slashes (vorne und) hinten korrigieren ... fertig

              ciao RS

              1. Moin!

                Besser $_SERVER['SCRIPT_NAME']

                Oder Du nimmst dirname() und ziehst vorne $_SERVER['DOCUMENT_ROOT'] ab, indem du einfach strlen() von DOCROOT vorne abschneidest und prüfst, ab das abgeschnittene Stück mit DOCROOT übereinstimmt

                Slashes (vorne und) hinten korrigieren ... fertig

                Äh. Nein. Das heisst: Nicht immer.

                Wir hatten das neulich bei Strato. Da muss in vielen Fällen (Strato) noch ein realpath() drumrum. Also:

                realpath($_SERVER['DOCUMENT_ROOT'])
                

                Jörg Reinholz

              2. Besser $_SERVER['SCRIPT_NAME']

                Oder Du nimmst dirname() und ziehst vorne $_SERVER['DOCUMENT_ROOT'] ab, indem du einfach strlen() von DOCROOT vorne abschneidest und prüfst, ab das abgeschnittene Stück mit DOCROOT übereinstimmt

                Slashes (vorne und) hinten korrigieren ... fertig

                Habe es jetzt so gelöst:

                $pfad = substr($_SERVER["SCRIPT_NAME"],0,strrpos($_SERVER["SCRIPT_NAME"],"/") + 1 );
                
            2. Tach!

              Gibt es eine einfache Möglichkeit, den Pfad zur aktuellen Datei auszulesen, relativ zum document-Root und ohne die Datei selbst?

              Alles was es zum Request an Daten gibt, steht in $_SERVER. Wenn da was passendes drin ist, dann kannst du das nehmen. Du musst aber prüfen, ob der Inhalt in allen Situationen gleich bleibt. Zum Beispiel wird bei vorhandenem Querystring selbiger zu einigen Einträgen hinzugefügt, zu anderen nicht. Außerdem sind nicht alle Parameter auf allen Servern vorhanden und/oder gleich benannt. Ein gewisser Grundstock ist allerdings meist verfügbar.

              Die aktuelle Datei steht außerdem in der Konstante FILE. Das ist bei Includes interessant, wenn du deren Dateinamen haben willst und nicht den vom Request und somit die gestartete Datei.

              dedlfix.

  2. Hallo Sumafu,

    $pingVerteiler = file_get_contents("ping.php?domain=blub");
    

    Allerdings gibt mit PHP folgenden Fehler aus:

    Warning: file_get_contents(ping.php?domain=blub): failed to open stream: No such file or directory in /ein/verzeichnis/datei.php on line 4
    

    Die Datei existiert aber und wenn ich den GET-Parameter weg lasse, dann gibt es keinen Fehler. Und auf einem anderen Webserver gibt es auch mit GET-Parameter keine Fehler. Woran könnte es also liegen, dass es nicht funktioniert?

    Du musst PHP die Chance geben zu erkennen, dass du über HTTP zugreifen möchtest. So „denkt“ PHP, dass du eine Datei im lokalen Dateisystem auslesen willst. Also so:

    $pingVerteiler = file_get_contents("http://localhost/ping.php?domain=blub");
    

    LG,
    CK

    1. Siehe Antwort von mir auf Reginald S.

      1. Hallo Sumafu,

        Siehe Antwort von mir auf Reginald S.

        das ändert nichts. Im lokalen Dateisystem gibt es keine GET-Parameter. Du musst das Protokoll mit angeben oder Alternativen via include benutzen; da gibt es dann immer noch keine GET-Parameter, aber du hast den gleichen Scope wie das eingebundene Script, es kann also auf die gleichen GET-Werte zugreifen wie dein Script.

        LG,
        CK

  3. Liebe(r) Sumafu,

    $pingVerteiler = file_get_contents("ping.php?domain=blub");
    

    Du solltest den Dateinamen auf den Teil vor dem Fragezeichen reduzieren, da die Datei im Verzeichnis keine GET-Parameter haben kann (sie sind ja auch nicht Teil des Dateinamens, sondern URL-Parameter).

    Die Datei existiert aber und wenn ich den GET-Parameter weg lasse, dann gibt es keinen Fehler.

    Eben. Ich vermute mal, dass Du irgendeine $_SERVER-Variable ausliest, um an den Dateinamen zu gelangen? Das könnte dann ungefähr so aussehen:

    $pingVerteiler = preg_replace('~.*/([^/?#]+).*~', '$1', $url);
    

    Liebe Grüße,

    Felix Riesterer.