У меня есть этот цикл:
//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() делает что-то с аппаратным таймером, что не позволяет предсказать правильную разницу во времени? Я понимаю, что мог бы использовать микротайм (правда), но понимаю, что в средах виртуальных машин он может быть еще менее точным.
Дикая догадка: ZipArchive::addFile() еще не вернулся.
@emilianoc в массиве 17000 файлов. тайм-аут PHP установлен на 20 секунд. вызывайте процесс несколько раз, чтобы убедиться, что у меня не кончается время. но я






Извините за задержку....
метод 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() и зафиксировать результаты. Это позволило мне заархивировать большое количество файлов без истечения времени выполнения сценария. Я завернул это в этот класс
Вы имеете в виду, что петля на молнии заканчивается раньше, чем через 10 секунд? Пожалуйста, добавьте больше деталей, например, полный тестируемый код... сколько файлов в массиве? .... что, если $i++ больше размера массива?