Задать вопрос
@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);
}

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

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

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

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

Похожие вопросы
18 дек. 2024, в 14:45
25000 руб./за проект
18 дек. 2024, в 14:43
25000 руб./за проект
18 дек. 2024, в 14:22
750 руб./за проект