@Valentine5

Как сделать прогресс бар скачивания одного файла?

Здравствуйте!

Есть функция 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&gt;%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);
}

но его не применишь, оно основано на цикле..

Вариант с сессиями не подходит потому что для сессии нужен браузер..
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
нужно создать потоковый контекст и использовать stream-notification-callback (см. пример).

Функция будет вызываться в процессе загрузки / выгрузки файла, сообщая о количестве переданных байтов. Это то, что нужно для отрисовки прогресс-бара.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vfreelancer
@vfreelancer
php
сделайте через js, например, dropzone js
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽