Lesen (profi)

Bei den vorherigen Lese-Funktionen, wurde die ganze Datei vollständig gelesen und in den Speicher gehauen. Bei sehr großen Dateien ist davon aber abzuraten, da sonst schnell der Speicher volllaufen kann, und dann heißts Ende.

Eine andere Methode wäre es, wenn wir eine Verbindung mit der Datei auf der Festplatte herstellen, und diese dort direkt und zeilenweise auslesen. Wann ist das günstig? Zum Beispiel wenn die Datei eine große Tabelle beinhaltet, und wir aber nur wenige Zeilen daraus benötigen (zum Beispiel Adressen). Wir merken uns beim Auslesen dann nur diese wenigen Zeilen (im Speicher), und alle anderen Daten verwerfen wir.

<?PHP
   
//  Pfad  und  Name  der  Datei
   
$dateiname  'meineAdressen.txt';

   
//  Verbindung  zur  Datei  herstellen  -  nur  lesen  "r"
   
$dateiVerbindung  fopen  $dateiname"r");

   
//  Zeilenweises  auslesen  mit  Hilfe  einer  Schleife
   
while  (  ($zeile  fgets($dateiVerbindung))  !==  FALSE)  {
         
//  In  der  Variabel  $zeile  liegt  nun  pro  Schleifendurchgang
          //  eine  der  Zeilen  unserer  Datei
          //  Die  Schleife  endet  nach  der  letzten  Zeile
         
echo  $zeile;
    }

   
//  Verbindung  zur  Datei  beenden
   
fclose  ($dateiVerbindung);

?>

Details

Schauen wir uns die ganzen Funktionen einmal genauer an.

  • fopen()
    Hiermit starten wir eine Direktverbindung zu einer Datei. Mit Hilfe dieser Verbindung können wir die Datei auf der Festplatte direkt manipulieren. In unserem Fall wollen wir aber nur lesen. Damit sichergestellt ist, dass wir sie nicht doch zufällig manipulieren, sagen wir es mit dem zweiten Parameter dazu: "r" (nur lesen).
    Die Verbindung (handle) wird in einer Variabel gespeichert, damit wir anderen Funktionen immer klar sagen können, mit welcher Verbindung (Datei) gearbeitet werden soll "$dateiVerbindung".
     
  • fgets()
    In der Schleife rufen wir "fgets()". Diese Funktion liest aus der Datei alle Zeichen bis zu einem Zeilenumbruch, und gibt diese zurück. Es wird sich auch gemerkt, an welcher Stelle sie gerade war. Beim nochmaligen Aufruf, liest sie an der Stelle weiter (daher eine Schleife). Den Rückgabewert geben wir immer an $zeile weiter. $zeile wird somit jedesmal überschrieben, und der Inhalt von vorher wird somit gelöscht (schont den Speicher).
    Sollte fgets mal nicht klappen, zum Beispiel am Dateiende, wird die Übergabe zu $zeile als "false" bewertet. Daher die Prüfung "!== false". Das bedeutet: Schleife durchführen solange die Übergabe (fgets) true ergibt (geklappt hat).
     
  • flcose()
    Damit beenden wir wieder eine Verbindung zu einer Datei. Dies passiert auch automatisch, wenn unser Programm beendet wird. ABER, ein guter Programmierer macht das selbst! :-)