Здравствуйте!
Есть функция getFileInOurFolder(), в которой file_put_contents качает в папку на жестком диске один единственный большой файл. Скрипт у меня консольный и он надолго замирает на этой операции. Возникла идея сделать прогресс бар, но все руководства рассматривают пример, когда скачивается несколько файлов или какие-то порции данных в цикле. Механизм прогресс бара соответственно основан на подсчете итераций циклов, которые постепенно скачивают то, что нужно. У меня ситуация другая. Есть file_put_contents однократно качающий один единственный файл.. Все спрятано в готовую функцию file_put_content и не ясно, как отловить начало-конец процесса.. притом, конец-то надо иметь заранее... Подскажите, пожалуйста, как можно решить данную проблему? Требуется шкала загрузки этого одного файла в консоли Ubuntu (скрипт консольный)
private function getFileInOurFolder()
{
$path = $_ENV["conf"]["database_saving_folder"];
$url = $_ENV["conf"]["source"]["link"] . $this->fileName . ".json.zip";
file_put_contents(__DIR__.$path.'database.json.zip', fopen($url, 'r'));
}
вот такое решение есть
/**
* Прогресс бар
*
* @param int $done выполнено итераций
* @param int $total всего итераций
* @param string $info информационное сообщение
* @param int $width ширина прогресс бара
*
*
return string
*/
function progressBar($done, $total, $info="", $width=50) {
$perc = round(($done * 100) / $total);
$bar = round(($width * $perc) / 100);
return sprintf("%s%% [%s>%s] %s\r", $perc, str_repeat("=", $bar), str_repeat(" ", $width-$bar), $info);
}
// Тестируем
$total = 15;
for ($i = 1; $i <= $total; $i++) {
echo progressBar($i, $total, 'какое-то сообщение', 80);
sleep(1);
}
/**
* Прогресс бар
*
* @param int $done выполнено итераций
* @param int $total всего итераций
* @param string $info информационное сообщение
* @param int $width ширина прогресс бара
*
* @return string
*/
function progressBar($done, $total, $info="", $width=50) {
$perc = round(($done * 100) / $total);
$bar = round(($width * $perc) / 100);
return sprintf("%s%% [%s>%s] %s\r", $perc, str_repeat("=", $bar), str_repeat(" ", $width-$bar), $info);
}
// Тестируем
$total = 15;
for ($i = 1; $i <= $total; $i++) {
echo progressBar($i, $total, 'какое-то сообщение', 80);
sleep(1);
}
но его не применишь, оно основано на цикле..
Вариант с сессиями не подходит потому что для сессии нужен браузер..