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

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

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


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

还是挺好看的!


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://qlalo.baihongyu.com/

你可能感兴趣的文章
Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHP支付宝demo)
查看>>
逻辑思考之,指定轮次提交赛事结果验证是否合法
查看>>
Atomic
查看>>
对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
查看>>
关于sql语句的优化问题
查看>>
SQL Server 2016新特性:数据库级别配置
查看>>
[Boost系列] Boost学习
查看>>
中美贸易战升级 医疗器械行业影响大
查看>>
exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp
查看>>
嵌入的iframe框架自适应宽度代码
查看>>
IPTABLES常用命令之配置生产环境IPTABLES及优化
查看>>
linux服务ssh详解
查看>>
cat命令一些不常用但很有用的参数
查看>>
双色球 脱壳加去效验
查看>>
php安装使用memcached
查看>>
#22 系统进程调度、at、batch、mail、crontab
查看>>
Intellij IDEA Debug调试技巧
查看>>
OPENSSL问题,使用fsockopen()函数提示错误
查看>>
lvs详细介绍
查看>>
ci框架hook钩子
查看>>