博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CLI】使用Curl下载文件实时进度条显示
阅读量:6573 次
发布时间:2019-06-24

本文共 2498 字,大约阅读时间需要 8 分钟。

最近在捣鼓命令行下的编程,下载文件总是一个难熬的过程,如果有进度条就好很多了!!!


先上一个进度条的扩展包,还是不错的

https://github.com/dariuszp/cli-progress-bar/raw/master/examples/img/terminal.gif
还是挺好看的!


curl做为 PHP 一个很常用的下载方式,这里简单的使用方式;

// 初始化一个 curl$ch = curl_init();// 设置请求的 urlcurl_setopt($ch, CURLOPT_URL, $url);// curl_setopt($ch, CURLOPT_HEADER, 0);// 不直接输出,而是通过 curl_exec 返回curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);if (false === ($stream = curl_exec($ch))) {    throw new \Exception(curl_errno($ch));}curl_close($ch);return $stream;

上面是一个很简单的例子,如果一个文件很大,那么用户就需要等待很长的时间,这时候我们就应该加上进度条的效果:

class Request{    protected $bar;    // 是否下载完成    protected $downloaded = false;    public function __construct()    {        // 初始化一个进度条        $this->bar = new CliProgressBar(100);        $this->bar->display();        $this->bar->setColorToRed();    }        function download($url)    {        $ch = curl_init();            // 从配置文件中获取根路径        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);        // 开启进度条        curl_setopt($ch, CURLOPT_NOPROGRESS, 0);        // 进度条的触发函数        curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress');        // ps: 如果目标网页跳转,也跟着跳转        // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);            if (false === ($stream = curl_exec($ch))) {            throw new \Exception(curl_errno($ch));        }            curl_close($ch);            return $stream;    }        /**     * 进度条下载.     *     * @param $ch     * @param $countDownloadSize    总下载量     * @param $currentDownloadSize  当前下载量     * @param $countUploadSize           * @param $currentUploadSize     */    public function progress($ch, $countDownloadSize, $currentDownloadSize, $countUploadSize, $currentUploadSize)    {                 // 等于 0 的时候,应该是预读资源不等于0的时候即开始下载         // 这里的每一个判断都是坑,多试试就知道了        if (0 === $countDownloadSize) {            return false;        }        // 有时候会下载两次,第一次很小,应该是重定向下载        if ($countDownloadSize > $currentDownloadSize) {            $this->downloaded = false;            // 继续显示进度条        }        // 已经下载完成还会再发三次请求        elseif ($this->downloaded) {            return false;        }        // 两边相等下载完成并不一定结束,        elseif ($currentDownloadSize === $countDownloadSize) {            return false;        }                // 开始计算        $bar = $currentDownloadSize / $countDownloadSize * 100;        $this->bar->progress($bar);    }}(new Request)->download('http://www.shiguopeng.cn/database.sql');

千万千万注意下载回调的判断那里的坑!!!

  • 还有一个问题:如果跳转下载的,设置了curl也跟着跳转,返回的文件将会出问题,
  • 我下载的是zip文件,会导致文件头有第一此请求的HTTP响应头的内容,
  • 所以看自己需要curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

转载地址:http://zkmjo.baihongyu.com/

你可能感兴趣的文章
交换两个变量的值
查看>>
35岁的程序员是“都挺好”还是“都挺惨”?\n
查看>>
Oracle回应用户锁定,自治数据库是更好选择
查看>>
想要确保架构目标达成?适合度函数了解一下
查看>>
庖丁解牛!深入剖析React Native下一代架构重构
查看>>
杀鸡儆猴!苹果撤销Facebook的iOS企业证书
查看>>
搜狗回应“统计加班时长裁员”;多家国产浏览器限制访问996.ICU;波音推迟737 Max软件修正丨Q新闻...
查看>>
健壮性V.S.准确率——18个深度图像分类模型的健壮性综述
查看>>
Beaker:一个基于Electron的点对点Web浏览器
查看>>
从大数据到AI:AI的现状和未来
查看>>
搭建移动端布局框架:整合flex
查看>>
KubeEdge:开源的Kubernetes原生边缘计算框架
查看>>
管理众包测试
查看>>
微软发布Azure Cosmos DB产品以及新的物联网解决方案
查看>>
理解BERT Transformer:Attention is not all you need!
查看>>
Nginx 学习书单整理
查看>>
从 Google 的一道面试题说起·
查看>>
大搜车孙信宇:一个好的团队应该去中心化
查看>>
VS2017 15.4提供预览版,面向Windows 10秋季更新(FCU)
查看>>
微软以75亿美元收购GitHub
查看>>