Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Menstrim Fail Zip Besar pada LAMP Stack untuk Muat Turun Lebih Pantas?

Bagaimana untuk Menstrim Fail Zip Besar pada LAMP Stack untuk Muat Turun Lebih Pantas?

Barbara Streisand
Barbara Streisandasal
2024-11-08 02:42:02709semak imbas

How to Stream Large Zip Files on LAMP Stack for Faster Downloads?

Mencipta Fail Zip On-the-Fly untuk Fail Besar pada Tindanan LAMP

Masalah:

Apabila mencipta fail zip berbilang fail besar untuk muat turun pengguna, kaedah konvensional mengakibatkan isu prestasi yang ketara semasa fasa awal disebabkan penggunaan CPU dan cakera yang berat.

Penyelesaian Menggunakan Penstriman:

Untuk menangani masalah ini, kami boleh memanfaatkan keupayaan penstriman zip dengan menggunakan popen() atau proc_open() untuk melaksanakan saluran paip arahan zip dan mendapatkan semula stdout sebagai aliran PHP. Dengan menggabungkan ini dengan proses pelayan web, kami boleh menstrim fail zip kepada pengguna semasa ia dibuat dengan cepat.

Pelaksanaan Menggunakan popen():

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

// Execute zip command and retrieve stdout as a stream
$fp = popen('zip -r - file1 file2 file3', 'r');

// Read and echo data in chunks
$bufsize = 65535;
$buff = '';
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}
pclose($fp);
?>

Petua untuk Pengoptimuman:

  • Gunakan saiz penimbal yang sesuai (cth., 8192 seperti yang dicadangkan oleh Benji dalam ulasan).
  • Matikan petikan ajaib jika perlu.
  • Tetapkan mb_http_output('pass') untuk prestasi optimum.
  • Gunakan pengepala berkaitan kandungan yang sesuai:

    • Jenis Kandungan: aplikasi/zip
    • Pelupusan kandungan: lampiran; filename="file.zip"

Malangnya, tidak mudah untuk menetapkan pengepala untuk menunjukkan penstriman atau panjang kandungan yang tidak diketahui dalam konteks ini.

Nota tentang flush():

Adalah penting untuk ambil perhatian bahawa memanggil flush() dalam gelung baca/gema boleh menyebabkan masalah dengan fail besar dan rangkaian perlahan disebabkan penimbal output dalaman Apache semakin ditakluki. Oleh itu, adalah lebih baik untuk meninggalkan panggilan flush() dalam kod.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Fail Zip Besar pada LAMP Stack untuk Muat Turun Lebih Pantas?. 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