Beim Lesen einer Datei mithilfe der Funktion " Datei_get_Contents in PHP ist die Datei zu groß, kann es möglicherweise nicht genügend Speicher geben. In diesem Artikel wird ausführlich analysiert, was dieses Problem verursacht, und einige wirksame Lösungen bereitstellen.
Datei_get_Contents ist eine sehr häufig verwendete Funktion in PHP zum Lesen von Dateiinhalten. Es ist sehr einfach zu verwenden. Geben Sie zum Beispiel den Dateipfad ein:
$content = file_get_contents('path/to/large/file.txt');
Wenn die Datei jedoch sehr groß ist, lädt File_get_Contents den Inhalt der gesamten Datei gleichzeitig in den Speicher. Wenn die Dateigröße das PHP-Speicherbegrenzung ( mpaem reaged_limit ) überschreitet, wird ein außerememory-Fehler geworfen.
Standardmäßig begrenzt PHP den maximalen Speicher, den Skripte verwenden können (über das Konfigurationselement MEAMMEIT_LIMIT ). Wenn Sie Datei_Get_Contents zum Lesen einer großen Datei verwenden, lädt PHP den Inhalt der gesamten Datei in den Speicher. Wenn die Dateigröße dieses Speichergrenze überschreitet, wird das Skript abstürzen und ein Fehler "Aus -Speicher" wird auftritt.
Wenn Sie beispielsweise eine Datei mit Hunderten von MB oder GB lesen, versuchen File_get_Contents , die gesamte Datei in den Speicher zu laden, und ein Fehler wird gemeldet, wenn die Speicherlimit von PHP überschritten wird.
Die direkteste Möglichkeit besteht darin, die Speichergrenze von PHP zu erhöhen, die durch Ändern von memory_limit in der Php.ini -Datei erreicht werden kann:
memory_limit = 512M
Oder Sie können Speichergrenzen in PHP -Skripten dynamisch festlegen:
ini_set('memory_limit', '512M');
Dieser Ansatz funktioniert jedoch nicht unbedingt, da für extrem große Dateien der Speicherüberlauf möglicherweise nicht vermieden wird, selbst wenn Speichergrenzwerte hinzugefügt werden.
Um zu vermeiden, dass das gesamte Datei gleichzeitig in den Speicher geladen wird, können Sie segmentierte Lesen verwenden, um den Block des Dateiinhalts mithilfe von FOPEN- und Fread -Funktionen zu lesen:
$handle = fopen('path/to/large/file.txt', 'r');
if ($handle) {
while (($chunk = fread($handle, 8192)) !== false) {
// Verarbeiten Sie Daten für jeden Block
echo $chunk; // Sie können den Inhalt direkt ausgeben oder eine andere Verarbeitung ausführen
}
fclose($handle);
} else {
echo "Die Datei kann nicht geöffnet werden";
}
Der Vorteil davon ist, dass nur ein Teil des Inhalts in der Datei jeweils gelesen wird und nicht zu viel Speicher in Anspruch nimmt.
Sie können auch stream_context_create verwenden, um einen Stream -Kontext zu erstellen und in Kombination mit File_Get_Contents zu streamen. Dadurch wird verhindert, dass die gesamte Datei gleichzeitig in den Speicher geladen wird. Beispiele sind wie folgt:
$options = [
'http' => [
'method' => 'GET',
'header' => "Content-Type: text/plain\r\n"
]
];
$context = stream_context_create($options);
$content = file_get_contents('http://gitbox.net/path/to/large/file.txt', false, $context);
Obwohl dieser Ansatz besser zum Umgang mit HTTP -Anfragen geeignet ist, kann er auch in anderen Streaming -Szenarien verwendet werden.
SplfileObject ist eine integrierte Klasse in PHP, die speziell zum Verarbeiten von Dateien verwendet wird. Lesen Sie die Dateizeile per Leitung und vermeiden Sie es, die gesamte Datei gleichzeitig in den Speicher zu laden. Beispiele sind wie folgt:
$file = new SplFileObject('path/to/large/file.txt');
while (!$file->eof()) {
$line = $file->fgets();
echo $line; // Verarbeiten Sie die Dateiinhaltszeile nach Zeile
}
Diese Methode eignet sich für die Verarbeitung von Textdateien, das Lesen von jeweils nur eine Zeile, und die Speicherverwendung ist sehr klein.
In einigen Fällen können Sie in Betracht ziehen, wenn die Speicherbeschränkung von PHP die Anforderungen immer noch nicht entspricht, in Betracht ziehen, einige Befehlszeilen-Tools auf Systemebene zu verwenden, um große Dateien wie Katze , awk oder sed zu verarbeiten und diese Tools dann über die Exec -Funktion von PHP aufzurufen:
$output = shell_exec('cat /path/to/large/file.txt');
echo $output;
Diese Methode eignet sich bei der Verarbeitung großer Dateien für schnelles Lesen. Achten Sie jedoch darauf, dass die Sicherheit und Berechtigungen von Systemwerkzeugen sichergestellt werden.
Wenn Sie große Dateien von einem Remote -Server abrufen müssen, können Sie Curl verwenden, um die Dateien in Stücken herunterzuladen. Curl unterstützt HTTP -Downloads, mit denen das Laden der gesamten Datei gleichzeitig das Laden des gesamten Speichers vermeiden kann. Das Beispiel lautet wie folgt:
$ch = curl_init('http://gitbox.net/path/to/large/file.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
$content = curl_exec($ch);
curl_close($ch);
Diese Methode eignet sich besonders zum Streaming -Lesen beim Umgang mit Remote -großen Dateien.
Das unzureichende Speicherproblem der Datei_Get_Contents beim Umgang mit großer Dateien wird normalerweise durch das Laden von PHP -Dateien in Speicher gleichzeitig verursacht. Um unzureichende Speicherfehler zu vermeiden, können wir eine Vielzahl von Methoden auswählen, z. B. die Speichergrenzwerte, das Lesen von Dateien in Stücken, Streaming -Lesemethoden usw.
Für verschiedene Situationen können unterschiedliche Lösungen ausgewählt werden, aber das grundlegende Ziel ist es, die Speicherverwendung zu reduzieren und nicht zu viel Daten auf einmal zu laden. Hoffentlich können die in diesem Artikel bereitgestellten Lösungen Ihnen dabei helfen, das Problem des unzureichenden Speichers beim Umgang mit großen Dateien zu lösen.
Verwandte Tags:
file_get_contents