Knut: Entfernte Ressource lesen

Hallo,

kann ich mit
  $input_url = 'http://example.com/programm.php?file=100/index.php';
  if ( $handle = fopen( $input_url, 'rb' ))
  ...
  else echo "klappt nicht";

eigentlich eine php- Datei ansprechen, die Daten ausgibt?

Wobei example.com mein Server ist. Die Datei 100/index.php ist vorhanden und das fopen klappt.

Datei 000/index.php ist auch vorhanden fopen klappt nicht.

Woran kann das liegen?

Gruß, Knut

  1. Hi,

    kann ich mit
      $input_url = 'http://example.com/programm.php?file=100/index.php';
      if ( $handle = fopen( $input_url, 'rb' ))
      ...
      else echo "klappt nicht";

    eigentlich eine php- Datei ansprechen, die Daten ausgibt?

    ja, wenn der Zugriff auf HTTP-Ressourcen mit fopen() und Co. grundsätzlich erlaubt ist (allow_url_fopen).

    Wobei example.com mein Server ist. Die Datei 100/index.php ist vorhanden und das fopen klappt.
    Datei 000/index.php ist auch vorhanden fopen klappt nicht.
    Woran kann das liegen?

    Vielleicht daran, dass sie doch nicht vorhanden, sondern entfernt ist? Oder wo liegt der Zusammenhang zum Thread-Titel?

    Ciao,
     Martin

    --
    Nein, es ist nicht wahr, dass bei der Post Beamte schneller befördert werden als Pakete.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      Wobei example.com mein Server ist. Die Datei 100/index.php ist vorhanden und das fopen klappt.
      Datei 000/index.php ist auch vorhanden fopen klappt nicht.
      Woran kann das liegen?

      Vielleicht daran, dass sie doch nicht vorhanden, sondern entfernt ist? Oder wo liegt der Zusammenhang zum Thread-Titel?

      Niemand hat sie entfernt, sie ist noch da auf dem Server example.com. Ich habe sie dorthin hochgeladen und sehe sie mit dem FTP-Programm.

      Es geht darum, dass ich Dateien (eben die 000/index.php, 100/index.php usw.) vom Server example.com auf den Server example2.com kopieren möchte.

      Kann mir nicht erklären, warum sich einige Dateien weigern, auf diese Weise kopiert zu werden. Die chmod- Angaben sind so wie bei den Dateien, die sich kopieren lassen. Und wenn ich die URL http://example.com/programm.php?file=000/index.php vom Browser aufrufe, kommt der Source- Code von 000/index.php auf das Display.

      Auch nicht merklich verzögert, an einen TimeOut hatte ich auch schon gedacht. Wie lange wartet fopen?

      Gruß, Knut

      1. Hallo,

        Woran kann das liegen?
        Vielleicht daran, dass sie doch nicht vorhanden, sondern entfernt ist? Oder wo liegt der Zusammenhang zum Thread-Titel?
        Niemand hat sie entfernt, ...

        warum schreibst du dann davon?

        Kann mir nicht erklären, warum sich einige Dateien weigern, auf diese Weise kopiert zu werden. Die chmod- Angaben sind so wie bei den Dateien, die sich kopieren lassen. Und wenn ich die URL http://example.com/programm.php?file=000/index.php vom Browser aufrufe, kommt der Source- Code von 000/index.php auf das Display.

        Works as expected.
        Im vorherigen Post hast du aber noch geschrieben:

        Datei 000/index.php ist auch vorhanden fopen klappt nicht.

        Also was nun? Geht oder geht nicht?

        Auch nicht merklich verzögert, an einen TimeOut hatte ich auch schon gedacht. Wie lange wartet fopen?

        Überhaupt nicht. In diesem Fall kann höchstens durch das verwendete Protokoll HTTP eine Wartezeit entstehen; das aber nur, wenn der Server nicht erreichbar ist. Eine Statusantwort wie "404 Not Found " oder "403 Forbidden" käme aber sofort. "Sofort" heißt hier, innerhalb der üblichen Reaktionszeit des Servers, also maximal ein paar Zehntelsekunden.

        Ich werde ehrlich gesagt immer noch nicht richtig schlau aus deiner Beschreibung.
        Vielleicht liegt es auch daran, dass außer "funktioniert nicht" noch keine Fehlerbeschreibung existiert, geschweige denn Ansätze zur Fehlersuche, etwa ein HTTP-Mitschrieb auf der Client- oder Serverseite?

        So long,
         Martin

        --
        Eine Nonne kommt in den Himmel. An der Pforte fragt Petrus: "Wer bist du?" - "Ich bin die Braut Jesu." Petrus stutzt einen Moment, ruft dann nach hinten: "He Freunde, habt ihr schon gehört? Der Juniorchef will heiraten!"
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo Martin,

          Vielleicht daran, dass sie doch nicht vorhanden, sondern entfernt ist? Oder wo liegt der Zusammenhang zum Thread-Titel?
          Niemand hat sie entfernt, ...

          warum schreibst du dann davon?

          Entfernt ist doppeldeutig. Im Titel war ein mehrere hundert Kilometer entfernter, aber vorhandener Server gemeint. Sämtliche Dateien sind auf jenem Server vorhanden. Also nicht entfernt im Sinne von gelöscht. Deutsche Sprache eben.

          Und wenn ich die URL http://example.com/programm.php?file=000/index.php vom Browser aufrufe, kommt der Source- Code von 000/index.php auf das Display.

          Im vorherigen Post hast du aber noch geschrieben:

          Datei 000/index.php ist auch vorhanden fopen klappt nicht.
          Also was nun? Geht oder geht nicht?

          Die Datei programm.php rufe ich mit fopen auf. Der Parameter file= bestimmt, was programm.php ausgibt. Das ist eine bestimmte Datei, die ich von einem auf den anderen Server kopieren möchte. php, jpg, mp3, ...

          Die Ausgabe funktioniert immer, wenn ich sie mit dem Browser auf einen Client hole. Aber ich will sie nicht auf dem Client, sondern auf dem Backup- Server. Was eben nicht mit jeder Datei funktioniert, ist der Aufruf mit fopen vom Backup- Server.

          Ich werde ehrlich gesagt immer noch nicht richtig schlau aus deiner Beschreibung.

          Es sind drei Rechner beteiligt. Ein Internet- Arbeitsplatz (Client), der per Browser mit dem Backup- Server verbunden ist. Der Backup- Server bekommt vom Client Anweisung, eine bestimmte Datei vom Hauptserver zu holen und bei sich selbst abzulegen.

          Vielleicht liegt es auch daran, dass außer "funktioniert nicht" noch keine Fehlerbeschreibung existiert, geschweige denn Ansätze zur Fehlersuche, etwa ein HTTP-Mitschrieb auf der Client- oder Serverseite?

          In der Dokumentation zu fopen habe ich keine Fehlermeldungen entdeckt. Eine digitale Funktion: Macht ein handle auf oder nicht.

          Keine Ahnung, wie ich den Fehler abfragen soll.

          Knut

      2. Hallo Knut,

        Niemand hat sie entfernt, sie ist noch da auf dem Server example.com. Ich habe sie dorthin hochgeladen und sehe sie mit dem FTP-Programm.

        Es geht darum, dass ich Dateien (eben die 000/index.php, 100/index.php usw.) vom Server example.com auf den Server example2.com kopieren möchte.

        wenn die Skripte von Host example.com auf Host example2.com kopiert werden sollen, Du das Kopierskript auf example.com liegen hast, dann ist ein Zugriff über http nicht erforderlich. Beim Zugriff über http wird natürlich nicht der Quelltext ausgelesen, sondern die Ausgabe des Skriptes gelesen.

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          wenn die Skripte von Host example.com auf Host example2.com kopiert werden sollen, Du das Kopierskript auf example.com liegen hast, dann ist ein Zugriff über http nicht erforderlich.

          Sondern wie?

          Beim Zugriff über http wird natürlich nicht der Quelltext ausgelesen, sondern die Ausgabe des Skriptes gelesen.

          Genau, das Script soll den Quellcode der durch Parameter bezeichneten Datei ausgeben. Das klappt bei manchen Dateien, bei anderen nicht.

          Ich bin kein bisschen schlauer geworden durch die bisherige Diskussion.

          Gruß, Knut

          1. Hallo,

            wenn die Skripte von Host example.com auf Host example2.com kopiert werden sollen, Du das Kopierskript auf example.com liegen hast, dann ist ein Zugriff über http nicht erforderlich.

            wenn sich beide Skripte auf dem gleichen Host befinden, gibt es doch gar keine "entfernte Ressource". Schreibrechte über http auf den anderen Host hast Du üblicherweise auch nicht (kein PUT), so dass Du den Inhalt des Skriptes zum Beispiel per POST an ein Empfangsskript auf dem entfernten Host senden könntest, das dort die Zieldatei wegschreibt.

            Beim Zugriff über http wird natürlich nicht der Quelltext ausgelesen, sondern die Ausgabe des Skriptes gelesen.

            Genau, das Script soll den Quellcode der durch Parameter bezeichneten Datei ausgeben. Das klappt bei manchen Dateien, bei anderen nicht.

            Ich bin kein bisschen schlauer geworden durch die bisherige Diskussion.

            Das geht bei entfernten Skriptdateien über http *nicht*, wenn diese dort *ausgeführt* werden. Du bekommst, wie ich Dir schrieb, ausschließlich die *Ausgabe* des Skriptes, *nicht* den Quelltext. Das ist sehr gut so.

            Freundliche Grüße

            Vinzenz

            1. Hallo Vinzenz,

              Das geht bei entfernten Skriptdateien über http *nicht*, wenn diese dort *ausgeführt* werden. Du bekommst, wie ich Dir schrieb, ausschließlich die *Ausgabe* des Skriptes, *nicht* den Quelltext. Das ist sehr gut so.

              volle Zustimmung hier, aber ich glaube, du hast ein wichtiges Detail übersehen. Knut hat eingangs die Beispielaufrufe genannt:

              http://example.com/programm.php?file=100/index.php

              Natürlich wird das Script "programm.php" dabei ausgeführt, und der Client bekommt nur dessen Ausgabe. Diese Ausgabe wird aber nach Knuts Beschreibung wohl der Quellcode von "100/index.php" sein, wenn ich den Sinn von programm.php richtig verstanden habe.
              Solange programm.php also nicht seinerseits per HTTP auf die als Parameter übergebene Datei/Ressource zugreift, ist das Problem für mich nicht nachvollziehbar.

              So long,
               Martin

              --
              Der Gast geht solange zum Tresen, bis er bricht.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hallo Martin,

                Solange programm.php also nicht seinerseits per HTTP auf die als Parameter übergebene Datei/Ressource zugreift, ist das Problem für mich nicht nachvollziehbar.

                und genau davon gehe ich aus. So verstehe ich Knut.

                a) Wenn er sich eine Datei anzeigen läßt, die auf genau dem Server liegt, auf
                   dem sein Skript programm.php läuft, wird ihm angezeigt, was er sich wünscht.

                b) Greift er auf PHP-Skripte zu, die auf dem entfernten Server laufen, mit
                   fopen, über den Wrapper für http, wird ihm nicht angezeigt, was er wünscht.
                   Ist ja auch klar, auf dem entfernten Server wird PHP ausgeführt und der
                   Aufruf des Skriptes führt dazu, dass er die Ausgabe des Skriptes erhält.
                   Produziert das Skript keine Ausgabe, ...

                Freundliche Grüße

                Vinzenz

                1. und genau davon gehe ich aus. So verstehe ich Knut.

                  a) Wenn er sich eine Datei anzeigen läßt, die auf genau dem Server liegt, auf
                     dem sein Skript programm.php läuft, wird ihm angezeigt, was er sich wünscht.

                  JA.

                  b) Greift er auf PHP-Skripte zu, die auf dem entfernten Server laufen, mit
                     fopen, über den Wrapper für http, wird ihm nicht angezeigt, was er wünscht.

                  Die Aussage ist auch richtig.

                  Mein Denkfehler war dieser:
                  Das Skript auf dem entfernten Server muss natürlich einen Fehler melden, wenn die gewünschte Datei nicht vorhanden ist oder nicht geöffnet werden kann.

                  Dann gebe ich einen Fehlertext aus, der mit FALSE beginnt.

                  Dummerweise habe ich den erhaltenen String mit strpos nach FALSE durchsucht und im "Erfolsfall" als Fehlermeldung verworfen. Das waren die Dateien, die sich nicht kopieren ließen.

                  Durch den Zwang hier, den Fehler zu beschreiben, bin ich drauf gekommen. Danke fürs Mitlesen, hat geholfen.

                  Gruß, Knut

                  1. Hi,

                    Das Skript auf dem entfernten Server muss natürlich einen Fehler melden, wenn die gewünschte Datei nicht vorhanden ist oder nicht geöffnet werden kann.

                    Dann gebe ich einen Fehlertext aus, der mit FALSE beginnt.

                    Warum eigentlich - wenn du mit HTTP doch ein Protokoll nutzt, das mit dem Statuscode und ggf. zusätzlichen Headern schon Möglichkeiten bietet, Fehler an die anfragende Stelle zu melden?

                    MfG ChrisB

                    --
                    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hallo,

    $input_url = 'http://example.com/programm.php?file=100/index.php';
      if ( $handle = fopen( $input_url, 'rb' ))
      ...
      else echo "klappt nicht";

    fopen klappt bei allen Aufrufen, wenn der Parameter file= *.gif und *.htm Dateien bezeichnet. Bei *.php Dateien klappt's manchmal nicht. Und dann sind es hartnäckig dieselben Dateien.

    Hier die Funktion in programm.php, die das Kopieren vom Hauptserver erledigen soll. Sorry, wenn es etwas "zerfleddert" aussieht:

    //============================================================================  
       function URL_kopieren ( $host_url, $input_file, $temp_file, $output_file, $kw )  
    //============================================================================  
    {  
      @set_time_limit( 300 ); // 5 min.  
      $input_url = $host_url."send_file.php?infile=".$input_file."&kw=".$kw;  
    //echo "<pre>input_url=[".$input_url."]</pre>\n";  
      if ( $handle = fopen( $input_url, 'rb' ) )  
      {  
        // VORLAUFENDES FILEDATUM LESEN  
        //------------------------------  
        $filemtime = '';  
        for ( $i=0; $i<15; $i++ )  
        {  
          $ziffer = fread( $handle, 1 );  
          if ( is_numeric( $ziffer )) $filemtime .= $ziffer; else break;  
        }  
        $contents = '';  
        while ( $block = fread( $handle, 1024 ))  
        {  
          $contents .= $block;  
        }  
    //echo "<pre>".$filemtime.$contents."</pre>";  
        $contents = decodiereString( $contents ); // codiert mit base64_encode()  
    echo "<pre>contents=[".$contents."]</pre>";  
      
        //-----------------  
        // DATEI SPEICHERN  
        //-----------------  
        if ( !strpos( 'x'.$contents, 'FALSE' ))  
        {  
          $out = fopen( $temp_file, "w" ); // w = write (zum Schreiben oeffnen  
          if ( $out )  
          {  
    //echo "temp_file=[".$temp_file."] geoeffnet<br>";  
            fwrite( $out, $contents );  
            fclose( $out );  
      
            if ( file_exists( $output_file ))  
            {  
              unlink( $output_file );  
            }  
            rename( $temp_file,   $output_file );  
            touch ( $output_file, $filemtime, $filemtime );  
      
            return array( $filemtime, $contents );  
          }  
          else  
          {  
    echo " Kann Datei [".$temp_file."] nicht zum Schreiben oeffnen:<br>";  
          }  
        }  
        else  
        {  
    echo "<pre>URL=[".$input_url."] kann nicht geoeffnet werden<br>[".$contents."]</pre>\n";  
        }  
      }  
      return FALSE;  
    }  
    //========== URL_kopieren  
    
    

    Das letzte echo "meldet". Und obwohl fopen nicht geklappt hat (wir sind beim else), wird die gewünschte Datei übermittelt, allerdings fehlen am Anfang etwa 20 Zeilen.

    Manchmal sieht man ja den Wald vor lauter Bäumen nicht, möglicherweise stimmt was nicht mit meiner Funktion.

    Gruß, Kurt

    1. Sorry,

      irgendwie bin ich gerade etwas durch den Wind. Die abgeschnittene Datei wird so abgeschnitten gesendet.

      Warum die gepostete Funktion allerdings in die else läuft ...

      Die Zeile

          if ( !strpos( 'x'.$contents, 'FALSE' ))  
      
      

      ist falsch. Selbst bei korrekter Übermittlung der Datei wird sie verworfen, wenn das Wort 'FALSE' irgendwo enthalten ist.

      Gruß, Knut