Gast: Lokale und entfernte Datei lesen

Hi,

wenn ich eine lokale Datei so öffne:

  
$datei = file( "beispiel.htm" );  

dann erhalte ich ein array, in dem jedes Element mit "\n" endet.

Öffne ich eine entfernte Datei aber so:

  
    $handle = fopen ( "http://example.com/beispiel.htm", "r");  
    if ($handle)  
    {  
      while (!feof ($handle))  
      {  
        $datei .= fgets ($handle, 1024);  
      }  
      $datei = explode( "\n", $datei );  
    }  

fehlt jedem Element das "\n". Da ich anschliessend dieselbe Routine zur Weiterverarbeitung brauche, ist ein einheitliches array wichtig.

Wie könnte explode() (oder ein anderes Kommando) ohne Datenverlust arbeiten?

Gruß, Frank

  1. Hi,

    wenn ich eine lokale Datei so öffne:

    $datei = file( "beispiel.htm" );

    
    > dann erhalte ich ein array, in dem jedes Element mit "\n" endet.  
      
    Und wenn du im Manual nachliest, dann merkst du, dass file zusätzliche Parameter nehmen kann.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Hi Chris,

      Und wenn du im Manual nachliest, dann merkst du, dass file zusätzliche Parameter nehmen kann.

      Danke für den Hinweis, ist aber nur die zweitbeste Lösung, weil ich dann die folgende Verarbeitung ändern muss.

      Das Öffnen der externen Datei ist neu, aber ich sehe, man könnte das ja auch mit file machen. Aber wie merke ich dann, wenn die externe Datei nicht vorhanden ist?

      Wenn $datei leer ist - oder wie?

      Gruß, Frank

      1. Wer auch das Kleingedruckte liest, ist klar im Vorteil:

        "Im Fehlerfall gibt file() FALSE zurück."

        1. Hello,

          Wer auch das Kleingedruckte liest, ist klar im Vorteil:

          "Im Fehlerfall gibt file() FALSE zurück."

          Dann weißt Du aber immer noch nicht, woran es gelegen hat. Dazu musst Du bei PHP leider den Fehlertext auswerten.

          Dazu musst Du z.B. mit ini_set('track_errors', 1) die Fehlertextregistrierung einschalten.
          http://www.php.net/manual/de/errorfunc.configuration.php#ini.track-errors

          Danach kannst Du dann in der Variable $php_errormsg
          http://www.php.net/manual/de/reserved.variables.phperrormsg.php
          den Fehlertext mittels strpos() auf das Vorhandensein typischer Textteile untersuchen und daraus die Ursache ableiten.

          Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi!

            Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...

            Gesperrt? Welcher HTTP-Status-Code ist das? Ist dir sowas schonmal in freier Wildbahn beim Browsen begegnet?

            Lo!

            1. Hello,

              Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...

              Gesperrt? Welcher HTTP-Status-Code ist das? Ist dir sowas schonmal in freier Wildbahn beim Browsen begegnet?

              Man bekommt dann nur eine Timeout für den Stream. Fsockopen funktioniert aber.
              Ich hatte das auch schon mal ausprobiert. Muss mal suchen, wie die Fehlermeldung dann lautet.

              Wie sich das dann auf file() auswirkt, was ja beide Funktionalitäten vereint, habe ich aber nicht ausprobiert.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hello,

                Hello,

                Es könnte auch sein, dass die Ressource gerade gesperrt ist für das lesen. Dann lohnt es sich ggf. ein paar Millisekunden später nochmals nachzufragen...

                Gesperrt? Welcher HTTP-Status-Code ist das? Ist dir sowas schonmal in freier Wildbahn beim Browsen begegnet?

                Man bekommt dann nur eine Timeout für den Stream. Fsockopen funktioniert aber.
                Ich hatte das auch schon mal ausprobiert. Muss mal suchen, wie die Fehlermeldung dann lautet.

                Wie sich das dann auf file() auswirkt, was ja beide Funktionalitäten vereint, habe ich aber nicht ausprobiert.

                Ich habe das jetzt nochmal ausprobiert.

                üblicherweise fürde man bei Verwendung von fopen() vorher ein Read-Timeout einstellen, dass kleiner ist, als die Maximlae Ausführungszeit des Scriptes.
                http://www.php.net/manual/en/function.stream-set-timeout.php

                Das muss man bei file() über den Parameter Ressource-Kontext tun.

                Da muss man sich dann gewaltig durchhangeln, um alles richtig einzustellen.
                Man landet letztendlich bei
                http://www.php.net/manual/en/context.http.php

                also:

                http://www.php.net/manual/en/function.stream-context-create.php
                http://www.php.net/manual/en/function.stream-context-set-option.php
                http://www.php.net/manual/en/context.http.php

                Viel Spaß dabei :-O

                Das Array sollte man sich irgendwo mit seinen Wunschwerten gefüllt beiseite legen ;-)

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
      2. Hello,

        Das Öffnen der externen Datei ist neu, aber ich sehe, man könnte das ja auch mit file machen. Aber wie merke ich dann, wenn die externe Datei nicht vorhanden ist?

        Wenn $datei leer ist - oder wie?

        Welche Fehlermeldung bekommst Du denn, wenn Du einen Request auf eine nicht vorhandene Ressource durchführst?

        Warning: file(http://bitworks.de/not_existing_file.txt) [function.file]: failed to open
            stream: HTTP request failed! HTTP/1.1 404 Not Found in
            M:\USER\TOM\WebProgTests\Xampp\dateizugriffe\download\get_url.php on line 3

        und ein var_dump($_data) ergibt dann

        bool(false)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hello Frank,

    für die Lösung deines Problemes möchte ich Dir die Streamfunktionen ans Herz legen.
    Benutze nicht die namensbasierten Funktionen (file(), file_get_contents(), usw.).

    Die sind für eine vernünftige Flusskontrolle und echten konkurrierenden Betrieb meistens ungeeignet.

    http://php.net/manual/en/function.stream-get-line.php in einer Schleife müsste das leisten, was Du erreichen willst und du hast dann volle Kontrolle über die Fehler-/Metadaten und kannst das Timeout auch passend einstellen, damit die Scriptlaufzeit (Max-Execution-Time) auf jedenfall länger ist.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de