PHP ZipArchive не добавляет более 700 файлов

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

Проблема действительно проста: 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();

person ShdNx    schedule 09.08.2010    source источник
comment
Есть сообщения об ошибках при включении error_reporting? Есть ли у класса запись ошибок?   -  person Pekka    schedule 09.08.2010
comment
И вы уверены, что вам просто не хватает времени или памяти?   -  person Pekka    schedule 09.08.2010
comment
(Удален предыдущий комментарий.) Я почти уверен, что у меня не заканчивается память или время (max_execution_time установлено в 0, и вывод правильно отображается после создания zip-файла). Однако я обнаружил, что получаю сообщение об ошибке. Пожалуйста, посмотрите мою правку.   -  person ShdNx    schedule 09.08.2010
comment
Просто подумайте: может быть, вам стоит попробовать добавить более 701 небольших файлов с открытым текстом или что-то подобное, чтобы убедиться, что это проблема с количеством файлов, а не какое-то другое странное совпадение.   -  person Joonas Trussmann    schedule 09.08.2010
comment
Можете ли вы показать полный код, который вы используете?   -  person Pekka    schedule 09.08.2010
comment
@Joonas: также не удается добавить его с тем же сообщением об ошибке. @Pekka: см. Мое редактирование.   -  person ShdNx    schedule 09.08.2010


Ответы (3)


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

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

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

person ts.    schedule 09.12.2011
comment
Это имеет смысл, но почему Zip держит каждый добавленный файл открытым до тех пор, пока не будет вызван Zip :: close ?! - person ShdNx; 10.12.2011
comment
Не совсем уверен, может быть, кто-то с большим опытом работы с внутренними механизмами php / алгоритмами сжатия может объяснить наверняка, но я полагаю, что это может быть 1 / для лучшего сжатия или 2 / для поддержания сжатых данных в актуальном состоянии и защиты файлов от изменения в середине работа или 3 / просто освобождение ресурсов / проблема с gc - person ts.; 11.12.2011

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

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

person Vladislav Rastrusny    schedule 09.08.2010
comment
Да, пробовал, результат тот же. Я также прочитал все комментарии и результаты поиска Google, которые смог найти. Пока ничего не помогло. : S - person ShdNx; 09.08.2010

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

person Александр Милаев    schedule 14.06.2013