Rumah > pembangunan bahagian belakang > tutorial php > Bagaimanakah Saya Boleh Menstrim Fail Besar dalam PHP Tanpa Memuatkannya Sepenuhnya ke dalam Memori?

Bagaimanakah Saya Boleh Menstrim Fail Besar dalam PHP Tanpa Memuatkannya Sepenuhnya ke dalam Memori?

Barbara Streisand
Lepaskan: 2024-12-19 22:38:15
asal
453 orang telah melayarinya

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

Menstrim Fail Besar dalam PHP

Fungsi file_get_contents terbina dalam PHP ialah cara yang mudah untuk membaca fail ke dalam rentetan, tetapi ia mempunyai had yang ketara: ia memuatkan keseluruhan fail ke dalam memori sekaligus. Ini boleh menjadi masalah untuk fail besar, kerana ia boleh menghabiskan had memori PHP anda dan menyebabkan skrip anda gagal.

Nasib baik, terdapat cara untuk menstrim fail besar kepada pengguna tanpa memuatkan semuanya ke dalam memori. Satu teknik melibatkan penggunaan fungsi readfile_chunked. Fungsi ini mengambil nama fail sebagai hujahnya dan menghantar kandungan fail ke penimbal output dalam ketulan saiz yang ditentukan.

Berikut ialah contoh cara menggunakan fungsi 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.';
}
Salin selepas log masuk

Dalam contoh ini, kami mentakrifkan pemalar CHUNK_SIZE untuk menentukan saiz setiap bahagian (dalam bait). Fungsi readfile_chunked kemudian membaca fail dalam ketulan dan menghantarnya ke penimbal output. Fungsi ob_flush dan flush dipanggil untuk memastikan ketulan dihantar kepada klien semasa ia dijana.

Teknik ini membolehkan anda menstrim fail besar kepada pengguna tanpa perlu memuatkan keseluruhan fail ke dalam memori. Ia merupakan cara yang cekap untuk menghantar fail besar melalui sambungan HTTP.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menstrim Fail Besar dalam PHP Tanpa Memuatkannya Sepenuhnya ke dalam Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan