Heim > Artikel > Backend-Entwicklung > Richtige Art, Dateien mit PHP zu lesen
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.
Traditionelle Fopen-Methode
Die Fopen-Methode ist wahrscheinlich die bekannteste für ehemalige C- und C++-Programmierer, denn wenn Sie diese Sprachen verwendet haben, sind sie Ihnen mehr oder weniger vertraut. Ein Werkzeug für viele Jahre. 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. Dateien mit fgets öffnen und lesen
$file_handle = fopen("myfile", "r");
while (!feof($file_handle) ) {
$line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
Während die meisten Programmierer mit haben Viele Jahre Erfahrung in der Programmierung sind mit diesen Funktionen vertraut, aber lassen Sie mich sie aufschlüsseln. Führen Sie effektiv die folgenden Schritte aus:
Öffnen Sie die Datei. $file_handle speichert einen Verweis auf die Datei selbst.
Überprüft, 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") ;
Diese 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);
Recall "
Hinweis: Die Beispiele für diese Funktion verwenden bereits etwas 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) 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);
Wenn die Dateilänge größer als dieser Wert ist, 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");
Das hier verwendete Format Funktionszeichenfolgen werden an vielen Stellen beschrieben (z. B. PHP.net), daher werde ich hier nicht auf Details 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
Wenn du verstehst, was „Cause there ain't no one for to take you no Pain“
bedeutet, dann hörst du zu viel von der Band America
Dann filtern Sie es durch die fgetss-Funktion.
Listing 3. Verwendung von fgetss
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
echo = fgetss($file_handle);
}
fclose($file_handle);
Das Folgende ist die Ausgabe:
Mein Titel
Wenn du verstehst, was „Weil es niemanden gibt, der dir keine Schmerzen gibt“
bedeutet, dann hörst du zu viel von der Band America
fpassthru-Funktion
Egal, wie Sie die Datei lesen, Sie können fpassthru verwenden, um die verbleibenden Daten an den Standardausgabekanal zu übertragen.
fpassthru($fh);
Außerdem druckt diese Funktion die Daten, sodass zum Abrufen der Daten keine Variablen 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 Kilobyte festlegen – können Sie schreiben:
fseek($fh, 1024);
From Ab PHP V4.0 stehen Ihnen einige zusätzliche Optionen zur Verfügung. 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 Sie können den folgenden Code verwenden, um 100 Bytes rückwärts zu springen:
fseek($fh, -100, SEEK_CUR);
Wenn Sie vorher 100 Bytes rückwärts springen müssen Am Ende der Datei sollte SEEK_END verwendet werden.
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.
Eine ganze 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 gestaltet werden Geschrieben als:
echo file_get_contents("myfilename");
In diesem Artikel wird hauptsächlich die Verarbeitung lokaler Dateien vorgestellt, es ist jedoch erwähnenswert, dass Sie diese auch verwenden können Funktionen zum Extrahieren, Echo und Analysieren anderer Webseiten.
echo file_get_contents("http://127.0.0.1/");
Dieser Befehl entspricht:
$fh = fopen( "http://127.0.0.1/", "r");
fpassthru($fh);
Wenn Sie sich diesen Befehl ansehen, werden Sie bestimmt denken: „Das ist immer noch zu viel Aufwand.“ PHP-Entwickler stimmen Ihnen zu. Daher kann der obige Befehl wie folgt gekürzt werden:
readfile("http://127.0.0.1/");
Die Funktion readfile liest die gesamte Datei oder Webseiteninhalte werden im Standardausgabepuffer gespeichert. Standardmäßig gibt dieser Befehl eine Fehlermeldung aus, wenn er fehlschlägt. Um dieses Verhalten zu vermeiden (falls erforderlich), versuchen Sie:
@readfile("http://127.0.0.1/");
Natürlich, wenn Sie es wirklich brauchen Beim Parsen einer Datei kann die einzelne von file_get_contents zurückgegebene Zeichenfolge etwas überwältigend sein. Ihr erster Instinkt könnte sein, es mit der Funktion „split()“ aufzuteilen.
$array = split("n", file_get_contents("myfile"));
Aber da es bereits eine gute Funktion gibt, die das für Sie erledigt, warum trotzdem Willst du so viel Zeit verbringen? 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 oben genannten 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 wird Dies Die Datei wird in ein Array abgelegt, dann wird das Array gedruckt:
$file_array = parse_ini_file("holy_grail.ini");
print_r $file_array;
unten Die Ausgabe ist das Ergebnis:
Listing 5. Ausgabe
Array
(
[name] => King Arthur
[quest] => ; Den Heiligen Gral suchen
[Lieblingsfarbe] => Blau
[Samuel Clemens] => Mark Twain
[Caryn Johnson] => Whoopi Goldberg
)
Natürlich fällt Ihnen möglicherweise auf, dass dieser Befehl die verschiedenen 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
Array
(
[persönliche Informationen] => Array
(
[Name] => König Arthur
[ Quest ] => Auf der Suche nach dem Heiligen Gral
[Lieblingsfarbe] => Blau
)
[mehr Sachen] => Array
(
[Samuel Clemens] => Mark Twain
[Caryn Johnson] => Whoopi Goldberg
)
)
PHP fügt die Daten in ein leicht analysierbares mehrdimensionales Array ein .
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
$filename = "myfile";
if (file_exists($filename) && is_readable ($filename)) {
$fh = fopen($filename, "r");
# Processing
fclose($fh);
}
In der Praxis verwenden Sie jedoch Such Der Code ist möglicherweise zu umständlich. 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 sichergestellt, dass die Dateiverarbeitung nur 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 der Verwendung von fclose wird nichts unternommen, auch 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. Eine typische Funktion wie fread ist in den meisten Fällen möglicherweise die beste Wahl, oder Sie fühlen sich vielleicht 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.