Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menstrim Fail Zip Secara Dinamik pada Timbunan LAMP Tanpa Membuat Fail Sementara?

Bagaimana untuk Menstrim Fail Zip Secara Dinamik pada Timbunan LAMP Tanpa Membuat Fail Sementara?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-07 14:42:03270semak imbas

How to Stream Zip Files Dynamically on a LAMP Stack Without Creating Temporary Files?

Cara Menstrim Fail Zip Secara Dinamik pada Timbunan LAMP

Cabaran

Mencipta arkib fail besar dengan segera dalam perkhidmatan web boleh membawa kepada isu prestasi dan kekangan sumber. Kaedah tradisional melibatkan mencipta fail zip sementara, menghasilkan CPU, cakera dan overhed memori.

Penyelesaian Penstriman dengan popen() dan flush()

Untuk mengelakkan kelemahan ini , pertimbangkan untuk menstrim penciptaan fail zip terus kepada pengguna. Ini boleh dicapai menggunakan popen() atau proc_open() untuk melaksanakan arahan saluran paip penstriman (cth., zip). Menggabungkan ini dengan flush() membolehkan penstriman yang cekap bagi fail zip semasa ia dibuat.

Contoh Disemak

Berikut ialah contoh kod yang dikemas kini yang menangani beberapa kaveat yang dibangkitkan oleh @Benji dalam ulasan:

<?php
// Set headers
header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');
mb_http_output('pass');

// Execute pipeline command using popen()
$fp = popen('zip -r - file1 file2 file3', 'r');

// Initialize buffer
$bufsize = 8192;

// Stream zip file
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}

// Close process
pclose($fp);

Nota: Walaupun flush() pada mulanya disyorkan, adalah dinasihatkan untuk mengelak daripada menggunakannya dalam gelung untuk fail besar atau rangkaian perlahan. Ini boleh membawa kepada isu overrun penimbal.

Pertimbangan Tambahan

Untuk pelayan berbilang pemproses, pertimbangkan untuk menggunakan nodeJS dengan modul http dan child_process untuk I yang cekap dan tidak menyekat. /O.

Menetapkan pengepala Panjang Kandungan tidak boleh dilakukan dalam senario ini kerana saiz fail zip tidak diketahui terlebih dahulu. Walau bagaimanapun, pertimbangkan untuk menyiasat jika terdapat pengepala yang menunjukkan penstriman atau panjang kandungan yang tidak diketahui.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Fail Zip Secara Dinamik pada Timbunan LAMP Tanpa Membuat Fail Sementara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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