相关疑难解决方法(0)

LAMP:如何为用户动态创建.Zip大型文件,无需磁盘/ CPU抖动

通常,Web服务需要压缩几个大文件以供客户端下载.最明显的方法是创建一个临时zip文件,然后将echo其创建给用户或将其保存到磁盘并重定向(将来某个时间删除它).

但是,这样做有缺点:

  • 密集的CPU和磁盘颠簸的初始阶段,导致......
  • 准备好存档时,用户会有相当大的初始延迟
  • 每个请求的内存占用非常高
  • 使用大量临时磁盘空间
  • 如果用户取消下载中途,初始阶段(CPU,内存,磁盘)中使用的所有资源都将被浪费

ZipStream-PHP这样的解决方案通过将数据按文件铲入Apache文件来改进这一点.但是,结果仍然是高内存使用率(文件完全加载到内存中),以及磁盘和CPU使用率的大幅飙升.

相反,请考虑以下bash片段:

ls -1 | zip -@ - | cat > file.zip
  # Note -@ is not supported on MacOS
Run Code Online (Sandbox Code Playgroud)

这里,zip以流模式运行,导致内存占用量低.管道具有整数缓冲区 - 当缓冲区已满时,OS会暂停写入程序(管道左侧的程序).这样可确保zip其输出速度与输出速度一样快cat.

然后,最佳方式是执行相同的操作:cat使用Web服务器进程替换,将zip文件流式传输给用户,并将其动态创建.与仅流式传输文件相比,这将产生很少的开销,并且将具有无问题的,非尖峰的资源配置文件.

如何在LAMP堆栈上实现这一目标?

php bash lamp zip pipe

43
推荐指数
1
解决办法
3万
查看次数

批量压缩(Zip)文件

使用:我们的用户在我们的AWS S3帐户中有许多对象.我们正在添加一个功能,可以立即下载整个项目.我们更关注效率而不是存储.

在查看了不同的选项(ZipArchive,PclZip)之后,我看到了本指南,建议使用Chilkat .

它的方法很有意义,总结如下:

  • 在上传时预先压缩每个文件并将其存储在S3中
  • "项目下载"开始下载每个压缩文件,然后QuickAppend(Chilkat术语),然后"立即"(每个文件200ms)将它们添加到整个压缩文件
  • 将新的Zip文件上传到S3,提供链接

我遇到的问题是Chilkat的许可证是249美元,我正在寻找免费的替代品.

替代方案(也是免费的)使用类似的概念:

  • 在上传时预先压缩每个文件并将其存储在S3中
  • "项目下载"开始下载每个压缩文件,然后tar将它们放在一起
  • 将新的Zip文件上传到S3,提供链接

处理这个问题有"标准"或"理想"方式吗?

php compression zip tar chilkat

8
推荐指数
1
解决办法
402
查看次数

如何使用标题php下载zip文件而不将其保存在服务器上

我有这个代码

<?php
$files = array('includes/s.xlsx', 'includes/test.html');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
 }
$zip->close();


header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=filename.zip');
header('Content-Length: ' . filesize($zipname));
readfile($zipname);
Run Code Online (Sandbox Code Playgroud)

但我不想将zip文件保存到服务器,我只是想将它提供给用户.

php zip

6
推荐指数
2
解决办法
6159
查看次数

创建一个zip文件

我有一个脚本来下载我的数据库转储,但文件越来越大.我尝试用以下方法压缩它:

$dump = `mysqldump -u $username -p$password $dbname`;
$fp = fopen('php://temp', 'r+');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, array('level' => 9));
fputs($fp, $dump);
rewind($fp);

//Envoi du "fichier"
$this->setLayout(false);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: SQL Dump");  
header('Content-Disposition: attachment; filename="mydump.sql.zip"'); 
$this->fichier = stream_get_contents($fp);
Run Code Online (Sandbox Code Playgroud)

但是这会创建一个无效的zip文件.我错过了什么吗?

编辑

标题中也一定有错误,Firefox将文件显示为"HTM文档",我无法显示文件大小.

php zip stream

2
推荐指数
1
解决办法
168
查看次数

标签 统计

php ×4

zip ×4

bash ×1

chilkat ×1

compression ×1

lamp ×1

pipe ×1

stream ×1

tar ×1