Имеет ли ZipArchive::addFile() конфликт с hrtime()?

У меня есть этот цикл:

//open archive $zip
$start = hrtime(true);
while(true) {
  $zip->addFile($files[$i++]);
  $end = hrtime(true);
  $time = ($end - $start) / 1e+9; // convert to seconds
  if ( $time > 10.0) {
    break;
  }
}
echo $i;

Я обнаружил, что таймер не останавливается точно через 10 секунд. А если я заменю цикл следующим:

//open archive $zip
$start = hrtime(true);
while(true) {
  sleep(1); // simulate work

  $end = hrtime(true);
  $time = ($end - $start) / 1e+9; // convert to seconds
  if ( $time > 10.0) {
    break;
  }
}
echo $i;

Цикл останавливается через 10 или более секунд. ZipArchive::addFile() делает что-то с аппаратным таймером, что не позволяет предсказать правильную разницу во времени? Я понимаю, что мог бы использовать микротайм (правда), но понимаю, что в средах виртуальных машин он может быть еще менее точным.

Вы имеете в виду, что петля на молнии заканчивается раньше, чем через 10 секунд? Пожалуйста, добавьте больше деталей, например, полный тестируемый код... сколько файлов в массиве? .... что, если $i++ больше размера массива?

emilianoc 19.06.2024 14:13

Дикая догадка: ZipArchive::addFile() еще не вернулся.

Siguza 19.06.2024 14:14

@emilianoc в массиве 17000 файлов. тайм-аут PHP установлен на 20 секунд. вызывайте процесс несколько раз, чтобы убедиться, что у меня не кончается время. но я

theking2 19.06.2024 17:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Извините за задержку....

метод addFile возвращает true или false в зависимости от статистики файла. так что да, результат возвращается асинхронно

затем файл добавляется в очередь, и все файлы в очереди добавляются синхронно так что нет, метод не асинхронный

Если вам нужно дождаться полной загрузки каждого файла, прежде чем загружать следующий, хорошим обходным решением будет открытие и закрытие zip-архива каждый раз, когда вы добавляете новый файл. поскольку $zip->close() будет ждать, пока все операции не будут выполнены

проверьте и протестируйте это и скажите мне, справится ли эта работа:

$zip = new ZipArchive;
//replace this with your zip file name========
$zipName = "./test.zip";//======================
//============================================


//dummy data===================================
//those are the files that i've used for test 
//of course you need to remove this part
$files=[];
for($i=0;$i<99;$i++){
    $files[$i] = "./bins/".$i.".bin";
}
//=============================================


//===================
$i=0;//init $i if you have't done it before
$start = hrtime(true);
while(true) {
    $zip->open($zipName,ZipArchive::CREATE);
    $zip->addFile($files[$i++]);
    $end = hrtime(true);
   
    $zip->close();
    $time = ($end - $start) / 1e+9; // convert to seconds

    //this is just for log remove it if you don't need it ========================
    echo "Step {$i}:( i:{$i}; time:{$time} )\n<br>\n";
    echo "\n<br>\n";
    //=======================================================================


    if ( $time > 10.0) {
        break;
    }
    $i++;
}

//this is just for log remove it if you don't need it ========================
sleep(5);
$end = hrtime(true);
$time = ($end - $start) / 1e+9; // convert to seconds
echo "end here:( time:{$time};  start:{$start};  end:{$end}; \n<br>\n";
//=========================================================

отличное решение. Я использовал его в качестве отправной точки, чтобы объединить несколько файлов, поставить ZipArchive::close() и зафиксировать результаты. Это позволило мне заархивировать большое количество файлов без истечения времени выполнения сценария. Я завернул это в этот класс

theking2 22.06.2024 15:12

Другие вопросы по теме