Erfahren Sie, wie Sie die verschiedenen Dateifunktionen von PHP verwenden. Sehen Sie sich grundlegende Dateifunktionen wie fopen, fclose und feof an; erfahren Sie mehr über Lesefunktionen wie fgets, fgetss und fscanf. Und Funktionen gefunden, die ganze Dateien in einer oder zwei Codezeilen verarbeiten.
Lassen Sie uns zählen, wie viele Möglichkeiten es gibt.
Eine der Freuden der Arbeit mit einer modernen Programmiersprache wie PHP ist die schiere Anzahl der verfügbaren Optionen. PHP gewinnt problemlos Perls Motto „Es gibt mehr als einen Weg, es zu tun“, insbesondere wenn es um die Dateiverwaltung geht. Aber welches ist bei so vielen verfügbaren Optionen das beste Werkzeug für diese Aufgabe? Die tatsächliche Antwort hängt natürlich von Ihren Zielen beim Parsen der Datei ab. Es lohnt sich also, sich die Zeit zu nehmen, alle Optionen zu erkunden.
Die traditionelle Fopen-Methode
Die Fopen-Methode ist ehemaligen C- und C++-Programmierern wahrscheinlich die bekannteste, denn wenn Sie diese Sprachen verwendet haben, sind sie mehr oder weniger Tools für Sie Habe es schon seit Jahren. Bei beiden Methoden wird die Datei mit der Standardmethode fopen (der Funktion zum Lesen von Daten) geöffnet und dann mit fclose geschlossen, wie in Listing 1 gezeigt.
Listing 1. Verwenden Sie fgets, um Dateien zu öffnen und zu lesen. line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
Obwohl die meisten Programmierer mit langjähriger Programmiererfahrung mit diesen Funktionen vertraut sind, möchte ich diese Funktionen aufschlüsseln. Führen Sie effektiv die folgenden Schritte aus:
Öffnen Sie die Datei. $file_handle speichert einen Verweis auf die Datei selbst.
Überprüfen Sie, ob Sie das Ende der Datei erreicht haben.
Lesen Sie die Datei weiter, bis das Ende der Datei erreicht ist, und drucken Sie jede Zeile aus, während sie gelesen wird.
Schließen Sie die Datei.
Mit diesen Schritten im Hinterkopf werde ich jede hier verwendete Dateifunktion überprüfen.
fopen
Die Funktion fopen stellt eine Verbindung zu einer Datei her. Ich sage „Verbindung erstellen“, weil fopen nicht nur eine Datei öffnen kann, sondern auch eine URL öffnen kann: $fh = fopen("http://127.0.0.1/", "r");
This Eine Codezeile stellt eine Verbindung zur obigen Seite her und ermöglicht es Ihnen, sie wie eine lokale Datei zu lesen.
Hinweis: Das in fopen verwendete „r“ zeigt an, dass die Datei schreibgeschützt geöffnet ist. Da das Schreiben von Daten in eine Datei den Rahmen dieses Artikels sprengt, werde ich nicht alle anderen Optionen auflisten. Wenn Sie jedoch aus Gründen der plattformübergreifenden Kompatibilität aus einer Binärdatei lesen, sollte „r“ in „rb“ geändert werden. Ein Beispiel dafür sehen Sie später.
feof
Der Befehl feof erkennt, ob Sie das Ende der Datei erreicht haben und gibt True oder False zurück. Die Schleife in Listing 1 wird fortgesetzt, bis Sie das Ende der Datei „myfile“ erreichen. Hinweis: feof gibt auch „False“ zurück, wenn eine URL gelesen wird und der Socket eine Zeitüberschreitung erfährt, weil keine Daten mehr zum Lesen vorhanden sind.
fclose
Wenn wir zum Ende von Listing 1 springen, bewirkt fclose das Gegenteil von fopen: Es schließt die Verbindung zu einer Datei oder URL. Nach Ausführung dieser Funktion können Sie keine Informationen mehr aus der Datei oder dem Socket lesen.
fgets
Wenn Sie in Listing 1 ein paar Zeilen zurückspringen, gelangen Sie zum Kern der Dateiverwaltung: dem eigentlichen Lesen der Datei. Für das erste Beispiel ist die Funktion fgets die Waffe der Wahl. Es extrahiert eine Datenzeile aus der Datei und gibt sie als Zeichenfolge zurück. Anschließend können Sie die Daten ausdrucken oder anderweitig bearbeiten. Das Beispiel in Listing 1 druckt die gesamte Datei einwandfrei.
Wenn Sie die Größe der verarbeiteten Datenblöcke begrenzen möchten, können Sie fgets einen Parameter hinzufügen, um die maximale Zeilenlänge zu begrenzen. Verwenden Sie beispielsweise den folgenden Code, um die Zeilenlänge auf 80 Zeichen zu begrenzen: $string = fgets($file_handle, 81);
Erinnern Sie sich an „Hinweis: Die Beispiele für diese Funktion verwenden bereits leicht andere Parameter als fopen. Denken Sie beim Arbeiten mit Binärdaten immer daran, die Option b in fopen einzubeziehen. Wenn Sie diesen Punkt überspringen, verarbeiten Microsoft® Windows®-Systeme die Datei möglicherweise nicht korrekt, da sie neue Zeilen anders behandeln. Wenn Sie es mit einem Linux®-System (oder einer anderen UNIX®-Variante) zu tun haben, scheint dies keine Rolle zu spielen. Aber selbst wenn Sie nicht für Windows entwickeln, führt dies zu einer guten plattformübergreifenden Wartbarkeit und ist eine gute Vorgehensweise.
Der obige Code liest 4.096 Byte (4 KB) an Daten. Hinweis: Egal wie viele Bytes angegeben sind, fread liest nie mehr als 8.192 Bytes (8 KB).
Der folgende Code sollte die gesamte Datei in eine Zeichenfolge einlesen, vorausgesetzt, die Dateigröße beträgt 8 KB oder weniger. $fh = fopen("myfile", "rb");
$data = fread($fh, filesize("myfile"));
fclose($fh);
if file Ist die Länge größer als dieser Wert, kann der Rest nur über eine Schleife eingelesen werden.
fscanf
Zurück zur String-Verarbeitung folgt fscanf auch der traditionellen C-Dateibibliotheksfunktion. Falls Sie damit nicht vertraut sind: fscanf liest Felddaten aus einer Datei in Variablen. list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");
Die von dieser Funktion verwendete Formatzeichenfolge wird an vielen Stellen beschrieben (z. B. in PHP). net), daher werde ich hier nicht näher darauf eingehen. Es genügt zu sagen, dass die Zeichenfolgenformatierung äußerst flexibel ist. Es ist zu beachten, dass alle Felder im Rückgabewert der Funktion platziert werden. (In C werden sie alle als Argumente übergeben.)
fgetss
Die fgetss-Funktion unterscheidet sich von herkömmlichen Dateifunktionen und vermittelt Ihnen ein besseres Verständnis der Leistungsfähigkeit von PHP. Diese Funktion funktioniert wie die Funktion fgets, entfernt jedoch alle gefundenen HTML- oder PHP-Tags, so dass nur einfacher Text übrig bleibt. Sehen Sie sich die unten gezeigte HTML-Datei an.
Listing 2. Beispiel-HTML-Datei ;
Dann filtern Sie es durch die fgetss-Funktion.
Listing 3. Verwendung von fgetss );
}
fclose($file_handle);
Das Folgende ist die Ausgabe: Mein Titel
Wenn Sie verstehen, was „Weil es niemanden gibt, der Ihnen keine Schmerzen gibt“
bedeutet, dann hören Sie zu viel von der Band America
fpassthru-Funktion
Egal, wie Sie die Datei lesen, Sie können fpassthru verwenden, um die verbleibenden Daten auf den Standardausgabekanal zu übertragen. fpassthru($fh);
Außerdem druckt diese Funktion die Daten, sodass keine Variablen zum Abrufen der Daten verwendet werden müssen.
Nichtlineare Dateiverarbeitung: Zugriff überspringen
Natürlich ermöglicht die obige Funktion nur das sequentielle Lesen von Dateien. Bei komplexeren Dateien müssen Sie möglicherweise zwischen verschiedenen Teilen der Datei hin und her springen. Hier kommt fseek ins Spiel. fseek($fh, 0);
Das obige Beispiel springt zurück zum Anfang der Datei. Wenn Sie nicht vollständig zurückgeben müssen – wir können die Rückgabe auf Kilobytes einstellen – dann können Sie schreiben: fseek($fh, 1024);
Ab PHP V4.0 haben Sie einige Andere Optionen. Wenn Sie beispielsweise von der aktuellen Position aus 100 Bytes vorwärts springen müssen, können Sie Folgendes versuchen: fseek($fh, 100, SEEK_CUR);
Ähnlich können Sie zum Springen den folgenden Code verwenden 100 Bytes rückwärts gehen: fseek($fh, -100, SEEK_CUR);
Wenn Sie vor dem Ende der Datei 100 Bytes rückwärts springen müssen, sollten Sie SEEK_END verwenden. fseek($fh, -100, SEEK_END);
Nachdem Sie den neuen Speicherort erreicht haben, können Sie fgets, fscanf oder eine andere Methode verwenden, um die Daten zu lesen.
Hinweis: fseek kann nicht für die Dateiverarbeitung verwendet werden, die sich auf URLs bezieht.
Gesamte Datei extrahieren
Jetzt gehen wir auf einige der einzigartigeren Dateiverwaltungsfunktionen von PHP ein: die Verarbeitung großer Datenblöcke in einer oder zwei Zeilen. Wie kann man beispielsweise eine Datei extrahieren und deren gesamten Inhalt auf einer Webseite anzeigen? Okay, Sie haben ein Beispiel für fgets gesehen, das eine Schleife verwendet. Doch wie kann dieser Prozess erleichtert werden? Der Vorgang ist mit fgetcontents, das die gesamte Datei in einen String einfügt, ganz einfach. $my_file = file_get_contents("myfilename");
echo $my_file;
Obwohl dies nicht die beste Vorgehensweise ist, kann dieser Befehl prägnanter geschrieben werden als: echo file_get_contents("myfilename") ;
Dieser Artikel konzentriert sich auf die Arbeit mit lokalen Dateien, aber es ist erwähnenswert, dass Sie diese Funktionen auch zum Extrahieren, Echoen und Analysieren anderer Webseiten verwenden können. echo file_get_contents("http://127.0.0.1/");
Dieser Befehl entspricht: $fh = fopen("http://127.0.0.1/", "r");
fpassthru($fh);
Sie werden sich diesen Befehl sicher ansehen und denken: „Das ist immer noch zu viel Aufwand.“ PHP-Entwickler stimmen Ihnen zu. Daher kann der obige Befehl wie folgt abgekürzt werden: readfile("http://127.0.0.1/");
Die Funktion readfile speichert den gesamten Inhalt der Datei oder Webseite im Standardausgabepuffer. Standardmäßig gibt dieser Befehl eine Fehlermeldung aus, wenn er fehlschlägt. Um dieses Verhalten zu vermeiden (falls erforderlich), versuchen Sie Folgendes: @readfile("http://127.0.0.1/");
Wenn Sie die Datei wirklich analysieren müssen, kann dies natürlich auch der einzelne String sein, der von file_get_contents zurückgegeben wird etwas sein Es ist zu viel, um es zu ertragen. Ihr erster Instinkt könnte sein, es mit der Funktion „split()“ aufzuteilen. $array = split("n", file_get_contents("myfile"));
Aber warum sich all diese Mühe machen, wenn es bereits eine nette Funktion gibt, die das für Sie erledigt? Die Funktion file() von PHP erledigt dies in einem Schritt: Sie gibt ein in Zeilen unterteiltes Array von Zeichenfolgen zurück. $array = file("myfile");
Es ist zu beachten, dass es einen kleinen Unterschied zwischen den beiden obigen Beispielen gibt. Obwohl der Befehl „split“ neue Zeilen entfernt, werden bei Verwendung des Befehls „file“ (wie beim Befehl „fgets“) dennoch neue Zeilen an die Zeichenfolgen im Array angehängt.
Die Leistungsfähigkeit von PHP geht jedoch weit darüber hinaus. Sie können parse_ini_file verwenden, um eine gesamte .ini-Datei im PHP-Stil in einem einzigen Befehl zu analysieren. Der Befehl parse_ini_file akzeptiert eine Datei ähnlich der in Listing 4 gezeigten.
Listing 4. Beispiel-INI-Datei
; Kommentar
[persönliche Informationen]
Name = „König Arthur“
Quest = Den Heiligen Gral suchen
Lieblingsfarbe = Blau
[mehr Sachen]
Samuel Clemens = Mark Twain
Caryn Johnson = Whoopi Goldberg
Der folgende Befehl speichert diese Datei in einem Array und gibt dann das Array aus: $ file_array = parse_ini_file("holy_grail.ini");
print_r $file_array;
Die folgende Ausgabe ist das Ergebnis:
Listing 5. Ausgabe 🎜> [Name] => König Artus
[Quest] => Auf der Suche nach dem Heiligen Gral
[Lieblingsfarbe] => Blau
[Samuel Clemens] => Mark Twain
[Caryn Johnson] => Whoopi Goldberg
)
Natürlich fällt Ihnen möglicherweise auf, dass dieser Befehl die Teile zusammenführt. Dies ist das Standardverhalten, aber Sie können es leicht beheben, indem Sie das zweite Argument an parse_ini_file übergeben: Process_sections, eine boolesche Variable. Setzen Sie „process_sections“ auf „True“. $file_array = parse_ini_file("holy_grail.ini", true);
print_r $file_array;
und Sie erhalten die folgende Ausgabe:
Listing 6. Ausgabe >(
[persönliche Informationen] => Array
(
[Name] => König Artus
[Quest] => Auf der Suche nach dem Heiligen Gral
[Lieblingsfarbe] = > Blau
)
[more stuff] => Array
(
[Samuel Clemens] => Mark Twain
[Caryn Johnson] => Whoopi Goldberg
)
)
PHP fügt die Daten in ein mehrdimensionales Array ein, das leicht analysiert werden kann.
Dies ist nur die Spitze des Eisbergs, wenn es um die Verarbeitung von PHP-Dateien geht. Komplexere Funktionen wie „tidy_parse_file“ und „xml_parse“ können Ihnen bei der Verarbeitung von HTML- bzw. XML-Dokumenten helfen. Einzelheiten zur Verwendung dieser Sonderfunktionen finden Sie unter „Ressourcen“. Diese Referenzen sind einen Blick wert, wenn Sie mit solchen Dateitypen arbeiten, aber ohne alle in diesem Artikel besprochenen Dateitypen zu überdenken, finden Sie hier einige gute allgemeine Regeln für die Arbeit mit den bisher behandelten Funktionen.
Best Practices
Gehen Sie niemals davon aus, dass alles in einem Programm wie geplant abläuft. Was passiert beispielsweise, wenn die gesuchte Datei verschoben wurde? Was passiert, wenn die Berechtigungen geändert wurden und der Inhalt nicht gelesen werden kann? Sie können diese Probleme im Voraus überprüfen, indem Sie file_exists und is_readable verwenden.
Listing 7. Verwendung von file_exists und is_readable ;
# Processing
. fclose($fh);
In der Praxis kann die Verwendung eines solchen Codes jedoch zu umständlich sein. Die Handhabung des Rückgabewerts von fopen ist einfacher und genauer. if ($fh = fopen($filename, "r")) {
# Processing
fclose($fh);
}
Da fopen bei einem Fehler False zurückgibt, wird dies der Fall sein Stellen Sie sicher, dass die Dateiverarbeitung nur dann durchgeführt wird, wenn die Datei erfolgreich geöffnet wurde. Wenn die Datei nicht existiert oder nicht lesbar ist, können Sie natürlich mit einem negativen Rückgabewert rechnen. Dies ermöglicht es der Inspektion, alle eventuell auftretenden Probleme zu prüfen. Wenn das Öffnen fehlschlägt, können Sie außerdem das Programm beenden oder veranlassen, dass das Programm eine Fehlermeldung anzeigt.
Wie die Funktion fopen geben auch die Funktionen file_get_contents, file und readfile alle False zurück, wenn das Öffnen oder die Verarbeitung der Datei fehlschlägt. Die Funktionen fgets, fgetss, fread, fscanf und fclose geben bei einem Fehler auch False zurück. Natürlich haben Sie möglicherweise die Rückgabewerte aller dieser Funktionen außer fclose verarbeitet. Bei Verwendung von fclose wird nichts unternommen, selbst wenn die Dateiverwaltung nicht ordnungsgemäß geschlossen wird. Daher ist es normalerweise nicht erforderlich, den Rückgabewert von fclose zu überprüfen.
Sie haben die Wahl
PHP mangelt es nicht an effizienten Möglichkeiten zum Lesen und Analysieren von Dateien. In den meisten Fällen ist eine typische Funktion wie fread möglicherweise die beste Wahl, oder Sie fühlen sich möglicherweise eher von der Einfachheit von readfile angezogen, wenn readfile genau das Richtige für die Aufgabe ist. Es hängt wirklich davon ab, was getan wird.
Wenn Sie mit großen Datenmengen arbeiten, wird sich fscanf als wertvoll erweisen und effizienter sein als die Verwendung von „file“ mit den Befehlen „split“ und „sprintf“. Wenn Sie hingegen eine große Textmenge mit nur geringfügigen Änderungen wiedergeben möchten, ist die Verwendung von file, file_get_contents oder readfile möglicherweise besser geeignet. Dies kann der Fall sein, wenn PHP zum Caching verwendet oder ein Notlösungs-Proxyserver erstellt wird.
PHP stellt Ihnen eine Vielzahl von Tools zur Verarbeitung von Dateien zur Verfügung. Erfahren Sie mehr über diese Tools und erfahren Sie, welche für das Projekt, an dem Sie arbeiten, am besten geeignet sind. Sie haben bereits viele Möglichkeiten, also nutzen Sie sie und genießen Sie die Arbeit mit Dateien in PHP.