【问题标题】:Zipping large directory on Windows Server using PHP使用 PHP 在 Windows Server 上压缩大目录
【发布时间】:2013-11-13 02:13:17
【问题描述】:

我想在 Windows Server 上压缩一个包含 50K 文件的大文件夹。我目前正在使用此代码:

include_once("CreateZipFile.inc.php");
$createZipFile=new CreateZipFile;

$directoryToZip="repository";
$outputDir=".";
$zipName="CreateZipFileWithPHP.zip";

define("ZIP_DIR",1); //


if(ZIP_DIR)
{
//Code toZip a directory and all its files/subdirectories
$createZipFile->zipDirectory($directoryToZip,$outputDir);
}else
{
//?
}

$fd=fopen($zipName, "wb");
$out=fwrite($fd,$createZipFile->getZippedfile());
fclose($fd);
$createZipFile->forceDownload($zipName);
@unlink($zipName);

在大约 2K 图像文件之前一切正常。但这不是我想要得到的。我愿意至少处理 50K 图像压缩。同时我的脚本得到这个错误:

致命错误:C:\xampp\htdocs\filemanager\CreateZipFile.inc.php 第 92 行的最大执行时间超过 360 秒

$newOffset = strlen(implode("", $this->compressedData));

我正在寻找任何解决方案来处理如此大量的文件。我目前在 Windows Server 2008 Standard 上使用 XAMPP。是否有可能制作一小部分 zip,使用系统命令和外部工具打包它们,然后将其发送到 header 下载?

http://pastebin.com/iHfT6x69 用于 CreateZipFile.inc.php

【问题讨论】:

  • 考虑设置一个作业服务器,使用类似 Gearman 的工具。
  • 听起来不错,但设置起来对我来说很难:(
  • 为什么?给自己一个 VPS,它可以用几个命令安装。如果你不知道怎么做,那么你可以学习;这是值得学习的技术。
  • 好的 clets 认为 Gearman 可以在那里工作吗?
  • 嗯,是的,这就是我建议:) 的原因。 Gearman 作为守护进程(后台进程)运行,并且您设置了一组执行后台工作的工作人员。如果你有一个合适的 zip 库,你可以读取一个压缩的百分比,它可以用作工作人员向 Gearman 报告进度,并且在你的在线应用程序中,你可以 (a) 开始工作,(b) 检查状态的工作,以及 (c) 以百分比形式查看工作的完成情况。它很健壮,并且有很多文档。我用它来渲染文档和爬网——任何你不能在在线应用程序中做的事情。

标签: php zip windows-server


【解决方案1】:

您需要较小的文件还是快速提供的文件? 为了在没有压缩和没有内存泄漏的情况下快速提供服务,您可以尝试将系统命令与 gzip 等 zip 软件一起使用并打开压缩。

文件可能会变得很大,但会作为一个文件快速提供。

【讨论】:

  • 我搜索了一下,几乎找不到任何用于打包的 gzip 脚本,请问您有 1 个吗?
  • 尝试这样的事情:在你的服务器上安装 GnuZip 运行:system('path/to/gzip -1 nameofdirectory', $retval) 你将把目录中的文件打包到一个。 gz 文件 GNUZip 的其他参数在帮助中有详细记录。希望这会对你有所帮助。
  • 那么怎么样? system('gzip', $retval) 我从来没有用过这样的命令
  • 使用系统,您可以像在控制台/bat 中那样向系统编写命令,这些命令不会使用您的 php 任务/线程,它们会自行运行,也不会使用您拥有的 php gzip 的内存单独安装,而不是从 php 运行它,它会处理你的 zip 文件,不确定它有多大比如php的响应时间
  • 我认为我安装了节点并对其进行了很好的配置,当我输入 cmd $ npm install adm-zip 时它向我显示...为什么?
【解决方案2】:

试试这个 .. 增加执行时间

ini_set('max_execution_time', 500);

500 是 os 秒数,将其更改为您喜欢的任何值

【讨论】:

  • 这不是我为什么要让某人在网站上等那么久的原因。它可能应该以某种方式“在后台”运行:s 并且肯定 500s 对这段代码来说是不够的。
  • 据我所知,php 没有“在后台”。如果您想继续使用 PHP,您可以查看 cron jobs,它允许您定期执行某些任务。不过,这可能仍需要@Zeedias 解决方案(如果可行的话:P)。
  • 你可以赚5000。但无论如何用户必须等待服务器响应。即使您在后台运行代码。这一切都取决于你的机器。
  • 那么我的朋友,cron 作业有什么例子吗?我正在考虑为该过程制作一个弹出窗口。这个案子真的让我恶心:((
  • 不过,我需要在这个问题上悬赏。
猜你喜欢
  • 2013-07-09
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2020-10-30
相关资源
最近更新 更多