PHP ZipArchive не добавляет более 700 файлов - PullRequest
0 голосов
/ 09 августа 2010

У меня проблема с классом php_zip.dll ZipArchive.Я использую его через класс-оболочку ZipArchiveImproved, предложенный на php.net, чтобы избежать проблемы с максимальным дескриптором файла.

Проблема действительно проста: правильно добавлено 700 файлов (файлы изображений jpg), а остальныевыходит из строя.Метод addFile возвращает false.

Версия PHP - 5.2.6.

Странно то, что на самом деле это работало.
В чем может быть проблема?Можете ли вы дать мне какие-либо подсказки?

Заранее большое спасибо!

Редактировать: извините, это не правда, что я не получаю сообщение об ошибке (display_errors был отключен в php.Ини я раньше этого не замечал).Из файла 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();

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Вероятно, это связано с максимальным количеством открытых файлов в вашей ОС (для получения более подробной информации см. http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/; это может быть сделано в масштабе всей системы или только для пользователя).

Zip сохраняет каждое добавленноефайл открыт до вызова Zip :: close.

Решение состоит в том, чтобы закрыть и снова открыть архив каждые X файлов (256 или 512 должны быть безопасными значениями).

0 голосов
/ 14 июня 2013

Я решил эту проблему, увеличив ulimit: ulimit -n 8192.

0 голосов
/ 09 августа 2010

Проблема описана здесь: http://www.php.net/manual/en/function.ziparchive-open.php#88765

Вы пытались указать оба флага?

...