【问题标题】:PHP ZipArchive not adding more than 700 filesPHP ZipArchive 不添加超过 700 个文件
【发布时间】:2010-08-09 11:47:40
【问题描述】:

我对 php_zip.dll 的 ZipArchive 类有疑问。我通过 php.net 上建议的 ZipArchiveImproved 包装类使用它来避免最大文件句柄问题。

问题其实很简单:700个文件添加正确(jpg图片文件),其余的都失败了。 addFile 方法返回 false。

PHP 版本为 5.2.6。

奇怪的是,这实际上曾经有效。
可能是什么问题呢?你能给我一些线索吗?

非常感谢您!

编辑:抱歉,我没有收到任何错误消息是不正确的(display_errors 在 php.ini 中已关闭,我之前没有注意到它)。从 701. 文件开始,我收到以下错误消息:

Warning: ZipArchive::addFile() [ziparchive.addfile]: Invalid or unitialized Zip object in /.../includes/ZipArchiveImproved.class.php on line 104

看起来 close() 调用返回 false,但没有发出错误。有什么想法吗?

编辑2:相关来源:

include_once DIR_INCLUDES . 'ZipArchiveImproved.class.php';

ini_set('max_execution_time', 0);

$filePath = $_SESSION['fqm_archivePath'];

$zip = new ZipArchiveImproved();
if(! $zip->open($filePath, ZipArchive::CREATE))
{
    echo '<div class="error">Hiba: a célfájl a(z) "' . $filePath . '" útvonalon nem hozható létre.</div>';
    return;
}

echo('Starting (' . count($_POST['files']) . ' files)...<br>');

$addedDirs = array();
foreach($_POST['files'] as $i => $f)
{
    $d = getUserNameByPicPath($f);
    if(! isset($addedDirs[$d]))
    {
        $addedDirs[$d] = true;
        $zip->addEmptyDir($d);

        echo('Added dir "' . $d . '".<br>');
    }

    $addName = $d . '/' . basename($f);
    $r = $zip->addFile($f, $addName);
    if(! $r)
    {
        echo('<font color="Red">[' . ($i + 1) . '] Failed to add file "' . $f . '" as "' . $addName . '".</font><br>');
    }
}

$a = $zip->addFromString('test.txt', 'Moooo');
if($a)
{
    echo 'Added string successfully.<br>';
}
else
{
    echo 'Failed to add string.<br>';
}

$zip->close();

【问题讨论】:

  • 开启error_reporting时有什么错误信息吗?该类是否有错误日志记录?
  • 你确定你不是简单地耗尽了时间或内存?
  • (删除了之前的评论。)我很确定我没有耗尽内存或时间(max_execution_time 设置为 0,并且在创建 zip 文件后正确显示输出) .但是,我发现我收到了一条错误消息。请查看我的编辑。
  • 只是一个想法:也许你应该尝试添加 701+ 个小的纯文本文件或类似的东西,以确保这是文件数量的问题,而不是其他一些奇怪的巧合。
  • 你能显示你正在使用的完整代码吗?

标签: php zip ziparchive


【解决方案1】:

这可能是因为您的操作系统中打开的文件数量最多(请参阅http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/ 了解更多详细信息;它可以由系统范围或只是用户限制)。

Zip 保持每个添加的文件打开,直到调用 Zip::close。

解决方案是关闭并重新打开每个 X 个文件的存档(256 或 512 应该是安全值)。

【讨论】:

  • 这是有道理的,但到底为什么 Zip 会在调用 Zip::close 之前一直打开每个添加的文件?!
  • 不太确定,也许有更多 php 内部/压缩算法经验的人可以肯定地解释,但我想这可以是 1/ 更好的压缩或 2/ 保持压缩数据最新并保护文件在工作中被更改或 3/ 只是资源释放/ gc 问题
【解决方案2】:

问题描述在这里:http://www.php.net/manual/en/function.ziparchive-open.php#88765

您是否尝试指定这两个标志?

【讨论】:

  • 是的,我试过了,结果一样。我还阅读了我能找到的所有 cmets 和谷歌搜索结果。到目前为止没有任何帮助。 :S
【解决方案3】:

我通过增加 ulimit 解决了这个问题:ulimit -n 8192

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多