通常,Web服務(wù)需要壓縮幾個(gè)大文件以供客戶端下載。最明顯的方法是創(chuàng)建一個(gè)臨時(shí)zip文件,然后將echo其創(chuàng)建給用戶或?qū)⑵浔4娴酱疟P并重定向(將來(lái)某個(gè)時(shí)間刪除它)。但是,這樣做有缺點(diǎn):密集的CPU和磁盤顛簸的初始階段,導(dǎo)致......準(zhǔn)備好存檔時(shí),用戶會(huì)有相當(dāng)大的初始延遲每個(gè)請(qǐng)求的內(nèi)存占用非常高使用大量臨時(shí)磁盤空間如果用戶取消下載中途,初始階段(CPU,內(nèi)存,磁盤)中使用的所有資源都將被浪費(fèi)像ZipStream-PHP這樣的解決方案通過(guò)將數(shù)據(jù)按文件鏟入Apache文件來(lái)改進(jìn)這一點(diǎn)。但是,結(jié)果仍然是高內(nèi)存使用率(文件完全加載到內(nèi)存中),以及磁盤和CPU使用率的大幅飆升。相反,請(qǐng)考慮以下bash片段:ls -1 | zip -@ - | cat > file.zip # Note -@ is not supported on MacOS這里,zip以流模式運(yùn)行,導(dǎo)致內(nèi)存占用量低。管道具有整數(shù)緩沖區(qū) - 當(dāng)緩沖區(qū)已滿時(shí),OS會(huì)暫停寫入程序(管道左側(cè)的程序)。這樣可確保zip其輸出速度與輸出速度一樣快cat。然后,最佳方式是執(zhí)行相同的操作:cat使用Web服務(wù)器進(jìn)程替換,將zip文件流式傳輸給用戶,并將其動(dòng)態(tài)創(chuàng)建。與僅流式傳輸文件相比,這將產(chǎn)生很少的開銷,并且將具有無(wú)問(wèn)題的,非尖峰的資源配置文件。如何在LAMP堆棧上實(shí)現(xiàn)這一目標(biāo)?
LAMP:如何為用戶動(dòng)態(tài)創(chuàng)建.Zip大型文件,無(wú)需磁盤/ CPU抖動(dòng)
慕運(yùn)維8079593
2019-08-30 17:35:13