Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menstrim Fail Zip Besar dalam PHP Tanpa Masalah Sumber?

Bagaimana untuk Menstrim Fail Zip Besar dalam PHP Tanpa Masalah Sumber?

DDD
DDDasal
2024-11-07 21:02:02652semak imbas

How to Stream Large Zip Files in PHP Without Resource Overwhelm?

Mencipta .Zip Fail Besar dengan Cepat tanpa Sumber Overwhelm

Dalam perkhidmatan web, mencipta zip fail yang luas untuk dimuat turun boleh memerlukan sumber yang intensif. Pendekatan konvensional melibatkan mencipta fail zip sementara dan menggemakannya kepada pengguna atau menyimpannya ke cakera. Walau bagaimanapun, kaedah ini membawa kepada isu seperti:

  • Pancang Sumber Awal: Lonjakan dalam penggunaan CPU dan cakera semasa fasa penciptaan fail.
  • Kelewatan Muat Turun: Kelewatan yang ketara untuk pengguna yang menunggu penyiapan arkib.
  • Jejak Memori Berlebihan: Penggunaan memori yang ketara semasa pengendalian fail.
  • Disk Penggunaan Ruang: Penciptaan ruang cakera sementara untuk storan fail.
  • Baziran Sumber pada Pembatalan: Jika pengguna membatalkan pertengahan muat turun, semua sumber yang digunakan pada fasa awal akan sia-sia.

Mengatasi Penggunaan Sumber

Pendekatan alternatif ialah memanfaatkan keupayaan penstriman alat baris arahan Linux, zip. Dengan menggunakan arahan saluran paip seperti ls -1 | zip -@ - | kucing > file.zip, zip boleh beroperasi dalam mod penstriman, menghasilkan jejak memori yang minimum. Paip dalam konteks ini berfungsi sebagai penampan; apabila penimbal diisi, sistem pengendalian menghentikan sementara program penulisan. Ini memastikan zip beroperasi pada rentak yang sejajar dengan kelajuan penulisan program yang disertakan.

Menstrim Fail Zip dengan PHP

Untuk mencapai mekanisme penstriman yang sama pada tindanan LAMP menggunakan PHP, anda boleh menggunakan fungsi popen() atau proc_open() untuk melaksanakan arahan zip. Stdout daripada arahan itu kemudiannya boleh diambil semula sebagai aliran PHP. Dengan menggabungkan teknik ini, coretan kod berikut menunjukkan cara menstrim fail zip kepada pengguna semasa ia dibuat:

header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');

$fp = popen('zip -r - file1 file2 file3', 'r');
$bufsize = 8192;
$buff = '';

while(!feof($fp)) {
   $buff = fread($fp, $bufsize);
   echo $buff;
}
pclose($fp);

Kod ini menstrim fail zip terus kepada klien tanpa memerlukan storan sementara atau penggunaan memori yang berlebihan. Ia secara berkesan meniru kefungsian perintah kucing dalam coretan bash.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Fail Zip Besar dalam PHP Tanpa Masalah Sumber?. 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