首頁 >後端開發 >php教程 >如何在 PHP 中高效地傳輸大檔案以避免記憶體耗盡?

如何在 PHP 中高效地傳輸大檔案以避免記憶體耗盡?

Patricia Arquette
Patricia Arquette原創
2024-12-05 14:38:15477瀏覽

How Can I Efficiently Stream Large Files in PHP to Avoid Memory Exhaustion?

使用PHP 串流大檔案

在您希望安全地為使用者提供大檔案一次性下載而不消耗過多資源的場景中內存,問題出現了:如何有效率地傳輸文件?

使用 file_get_contents() 的傳統方法由於潛在的記憶體限制,同時檢索整個檔案內容被證明是不切實際的。要解決此問題,請考慮採用以可管理的區塊的形式提供資料的串流方法。

在線來源中建議的解決方案是使用 readfile_chunked() 函數。此函數可讓您指定區塊大小並迭代讀取和輸出檔案內容,避免記憶體過載。

提供的程式碼範例示範了此方法的實作:

// Define the chunk size in bytes
define('CHUNK_SIZE', 1024*1024);

// 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 the number of bytes delivered.
    }

    return $status;
}

// Restrict access to logged-in users
if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: '.$mimetype );
    readfile_chunked($filename);
} else {
    echo 'Access denied.';
}

此方法以可管理的區塊的形式串流文件,避免記憶體限制並將文件有效地交付給用戶。

以上是如何在 PHP 中高效地傳輸大檔案以避免記憶體耗盡?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn