Dirk Ruchatz: Datei von fremdem Server kopieren

Moin moin,

da hat das Forum ja gerade rechtzeitg wieder aufgemacht ;-)

Ich steh gerade ein bisschen auf dem Schlauch: ich muss per AJAX auf ein XML-Daten zugreifen, die auf einem fremden Server per PHP generiert wird (ja, das rechtliche ist geklärt, auf die Daten darf zugegriffen werden).

Nun darf AJAX ja nur auf Daten auf dem eigenen Server zugreifen, deshalb ist meine Idee, die Datei einfach per PHP regelmäßig vom fremden Server auf den eigenen zu kopieren - per FTP kein Problem, aber ich kann nur per HTTP auf die Datei zugreifen.

Versuche mit

  • copy("http://example.org/test_xml.php", "lokal.xml")

  • include "http://example.org/test_xml.php" //allow_url_include ist On

und

  • readfile "http://example.org/test_xml.php" //allow_url_fopen ist On

haben leider zu keinem Erfolg geführt und mir gehen so langsam die Ideen aus...

Any ideas...?

Glück auf
Dirk

  1. Moin!

    haben leider zu keinem Erfolg geführt und mir gehen so langsam die Ideen aus...

    Definiere das mal genauer.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin Sven,

      haben leider zu keinem Erfolg geführt und mir gehen so langsam die Ideen aus...

      Definiere das mal genauer.

      nun ja, ich hatte 3 Ideen und die sind verbraucht ;-)

      Aber ich vermute mal, du meintest den ersten Teil des Satzes (und somit "'funzt net' ist keine klare Fehlerbeschreibung), oder...?

      • copy("http://example.org/test_xml.php", "lokal.xml")

      Warning: copy(http://example.org/test_xml.php) [function.copy]: failed to open stream: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.

      • include "http://example.org/test_xml.php" //allow_url_include ist On

      Warning: include() [function.include]: Failed opening 'http://example.org/test_xml.php' for inclusion

      • readfile "http://example.org/test_xml.php" //allow_url_fopen ist On

      Warning: readfile(http://example.org/test_xml.php) [function.readfile]: failed to open stream: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.

      Der Server, von dem ich die Daten abfrage, ist schnell genug, per Browser sehe ich die Daten in Sekundenbruchteilen, timeout steht auf 60 Sekunden, was also völlig reichen sollte.

      Glück auf
      Dirk

      1. Moin!

        • readfile "http://example.org/test_xml.php" //allow_url_fopen ist On
          Warning: readfile(http://example.org/test_xml.php) [function.readfile]: failed to open stream: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.

        Der Server, von dem ich die Daten abfrage, ist schnell genug, per Browser sehe ich die Daten in Sekundenbruchteilen, timeout steht auf 60 Sekunden, was also völlig reichen sollte.

        Ja, aber dein Browser ist nicht dein Server, und dein Server kriegt keine Verbindung zum anderen Server. Vermutlich eine Firewall im Weg.

        Das heißt: Egal was für andere PHP-Ideen hier noch auftauchen würden, sie würden alle scheitern aus demselben Grund.

        Kontaktiere deinen Provider, der wird mehr wissen.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Moin Sven,

          Ja, aber dein Browser ist nicht dein Server, und dein Server kriegt keine Verbindung zum anderen Server. Vermutlich eine Firewall im Weg.

          Das heißt: Egal was für andere PHP-Ideen hier noch auftauchen würden, sie würden alle scheitern aus demselben Grund.

          Kontaktiere deinen Provider, der wird mehr wissen.

          der Server ist in diesem Fall ein lokal installierter Apache (XAMPP), und müsste insofern doch im Firmennetz die gleichen Rechte haben wie ich als Anwender, oder? Falls ich das soweit richtig verstanden habe, blockiere ich mich also selbst ;-)

          allow_url_fopen und allow_url_include stehen auf on, FTP-get funktioniert, nur der HTTP-Abruf scheinbar nicht, gibt's da vielleicht noch Konfigurationsmöglichkeiten?

          Glück auf
          Dirk

          1. Moin!

            der Server ist in diesem Fall ein lokal installierter Apache (XAMPP), und müsste insofern doch im Firmennetz die gleichen Rechte haben wie ich als Anwender, oder?

            Nein, nicht automatisch. Das hängt selbstverständlich vom Firmennetz ab.

            Falls ich das soweit richtig verstanden habe, blockiere ich mich also selbst ;-)

            Nein.

            Werde auf dem Server zum User, unter dem der Apache bzw. PHP läuft. Fordere manuell die HTTP-Ressource ab und beobachte, was dabei passiert (Proxys im Spiel?), und welche Fehlermeldung konkret erscheint.

            Und sorge dann dafür, dass die Ursache des Problems abgestellt wird.

            Da ich nicht weiß, welches komplexe Firmennetz du nutzen mußt, und was dabei alles involviert ist (wie erwähnt: Firewall, Proxy, Useraccountrechte etc. spielen alle eine mögliche Rolle), kann ich nur allgemeine Hinweise geben.

            allow_url_fopen und allow_url_include stehen auf on, FTP-get funktioniert, nur der HTTP-Abruf scheinbar nicht, gibt's da vielleicht noch Konfigurationsmöglichkeiten?

            Die Fehlermeldung sagt eindeutig, dass PHP zwar HTTP versucht hat, aber der Request durch irgendeine Komponente im Netzwerk nicht beantwortet wurde. Das kann dein Firmennetz sein (vermutlich), oder irgendwas im Internet auf dem Weg zum Server.

            Es ist eine gute Idee, mit dem Zeugs anzufangen, auf das man Einfluß hat: Das eigene Firmennetz. :)

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Moin Sven,

              vielen Dank für die Tipps!

              Auf das Firmennetz habe ich leider keinen Einfluss, aber mir ist gerade noch eingefallen, dass auf dem Rechner ja auch eine Personalfirewall laufen kann, die den Zugriff blockiert, das werde ich morgen mal prüfen.

              Mein Code ist jedenfalls korrekt, wenn ich das ganze auf meinen Webspace lade, funktioniert alles...

              Glück auf & bis demnächst
              Dirk

              1. echo $begrüßung;

                Auf das Firmennetz habe ich leider keinen Einfluss, aber mir ist gerade noch eingefallen, dass auf dem Rechner ja auch eine Personalfirewall laufen kann, die den Zugriff blockiert, das werde ich morgen mal prüfen.
                Mein Code ist jedenfalls korrekt, wenn ich das ganze auf meinen Webspace lade, funktioniert alles...

                Es ist eher wahrscheinlich, wie es Sven auch schon erwähnt hat, dass der Zugriff auf das Internet nur über einen Proxy erfolgen darf. Dein Browser wird das so eingestellt haben, PHP kann nicht von Haus aus einen Proxy nutzen. Beim kurzen Überfliegen scheint curl Proxys als Option verwenden zu können, was aber nicht unbedingt in jeder PHP-Installation vorhanden ist. Ansonsten ist es auch nicht allzu schwierig direkt mit einem Proxy zu reden. Beispiele gibt es in den Userkommentaren zu fsockopen().

                echo "$verabschiedung $name";

                1. Moin dedlfix,

                  Es ist eher wahrscheinlich, wie es Sven auch schon erwähnt hat, dass der Zugriff auf das Internet nur über einen Proxy erfolgen darf. Dein Browser wird das so eingestellt haben, PHP kann nicht von Haus aus einen Proxy nutzen.

                  klar, das war's natürlich... Manchmal hat man aber auch einen ganzen Lattenzaun vorm Kopf - kommt wahrscheinlich daher, wenn man zu lange an einem Problem sitzt ;-)

                  Glück auf & vielen Dank
                  Dirk

  2. Schon probiert:
    http://de.php.net/manual/en/ref.curl.php ?

  3. Hello,

    per FTP kein Problem, aber ich kann nur per HTTP auf die Datei zugreifen.

    • copy("http://example.org/test_xml.php", "lokal.xml")
    • include "http://example.org/test_xml.php" //allow_url_include ist On

    sehe ich das richtig, dass auf dem fremden Server eine Datei liegt, die von PHP geparsed wird, aber an deren Rohform du rankommen willst? Mittels HTTP praktisch ausgeschlossen, sofern du sie genauso aufrufst wie jemand, der das Ergebnis des Parsens sehen will. Wenn es kein Sicherheitsrisiko ist, versehe das Skript mit einem Parameter, der den Rohzustand explizit ausliefert.

    MfG
    Rouven

    --
    -------------------
    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
    1. Moin Rouven,

      sehe ich das richtig, dass auf dem fremden Server eine Datei liegt, die von PHP geparsed wird, aber an deren Rohform du rankommen willst? Mittels HTTP praktisch ausgeschlossen, sofern du sie genauso aufrufst wie jemand, der das Ergebnis des Parsens sehen will. Wenn es kein Sicherheitsrisiko ist, versehe das Skript mit einem Parameter, der den Rohzustand explizit ausliefert.

      nee, ich will gerade nicht an die Rohform kommen, sondern das Ergebnis des Parsens als Datei auf dem lokalen Webserver ablegen - also genau das, was ich auch im Browser sehe, wenn ich die Adresse aufrufe.

      Glück auf
      Dirk