Heim >Backend-Entwicklung >PHP-Tutorial >Wie kann ich große Dateien in PHP streamen, ohne sie vollständig in den Speicher zu laden?

Wie kann ich große Dateien in PHP streamen, ohne sie vollständig in den Speicher zu laden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-19 22:38:15456Durchsuche

How Can I Stream Large Files in PHP Without Loading Them Entirely into Memory?

Große Dateien in PHP streamen

Die in PHP integrierte Funktion „file_get_contents“ ist eine bequeme Möglichkeit, eine Datei in einen String einzulesen, aber das ist der Fall eine wesentliche Einschränkung: Es lädt die gesamte Datei auf einmal in den Speicher. Dies kann bei großen Dateien problematisch sein, da es Ihr PHP-Speicherlimit erschöpfen und dazu führen kann, dass Ihr Skript fehlschlägt.

Glücklicherweise gibt es Möglichkeiten, eine große Datei an einen Benutzer zu streamen, ohne sie vollständig in den Speicher zu laden. Eine Technik besteht darin, die Funktion readfile_chunked zu verwenden. Diese Funktion verwendet einen Dateinamen als Argument und sendet den Dateiinhalt in Blöcken einer angegebenen Größe an den Ausgabepuffer.

Hier ist ein Beispiel für die Verwendung der Funktion readfile_chunked:

define('CHUNK_SIZE', 1024 * 1024); // Size (in bytes) of tiles chunk

// Function to read a file and display its content chunk by chunk
function readfile_chunked($filename, $retbytes = TRUE) {
    $buffer = '';
    $cnt    = 0;
    $handle = fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, CHUNK_SIZE);
        echo $buffer;
        ob_flush();
        flush();

        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }

    $status = fclose($handle);

    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }

    return $status;
}

// Check if the user is logged in
// ...

if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: ' . $mimetype);
    readfile_chunked($filename);

} else {
    echo 'Tabatha says you haven\'t paid.';
}

In diesem Beispiel definieren wir eine CHUNK_SIZE-Konstante, um die Größe jedes Blocks (in Bytes) anzugeben. Die Funktion readfile_chunked liest dann die Datei in Blöcken und sendet sie an den Ausgabepuffer. Die Funktionen „ob_flush“ und „flush“ werden aufgerufen, um sicherzustellen, dass die Blöcke bei ihrer Generierung an den Client gesendet werden.

Mit dieser Technik können Sie große Dateien an einen Benutzer streamen, ohne die gesamte Datei in den Speicher laden zu müssen. Dies ist eine effiziente Möglichkeit, große Dateien über HTTP-Verbindungen zu übermitteln.

Das obige ist der detaillierte Inhalt vonWie kann ich große Dateien in PHP streamen, ohne sie vollständig in den Speicher zu laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn