首页 后端开发 php教程 Curl下载文件显示实时进度条(附代码)

Curl下载文件显示实时进度条(附代码)

May 17, 2018 pm 01:51 PM
curl 实时 显示

这次给大家带来Curl下载文件显示实时进度条(附代码),Curl下载文件显示实时进度条的注意事项有哪些,下面就是实战案例,一起来看一下。

前言

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

先上一个进度条的扩展包,还是不错的https://github.com/dariuszp/cli-progress-bar (本地下载)

效果图:

还是挺好看的!

curl有什么用?

用php ,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。

curl使用

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

// 初始化一个 curl
$ch = curl_init();
// 设置请求的 url
curl_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);

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PHP动态添加XML数据步骤详解

CMSPRESS实现无限级分类(附代码)

以上是Curl下载文件显示实时进度条(附代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

删除 Windows 11 搜索中的新闻和趋势内容的方法 删除 Windows 11 搜索中的新闻和趋势内容的方法 Oct 16, 2023 pm 08:13 PM

当您单击Windows11中的搜索字段时,搜索界面会自动展开。它在左侧显示最近程序的列表,在右侧显示Web内容。Microsoft在那里显示新闻和趋势内容。今天的支票宣传了必应新的DALL-E3图像生成功能、“与必应聊天龙”的提议、有关龙的更多信息、来自网络部分的热门新闻、游戏建议和趋势搜索部分。整个项目列表与您在计算机上的活动无关。虽然一些用户可能会喜欢查看新闻的能力,但所有这些都可以在其他地方大量获得。其他人可能会直接或间接将其归类为促销甚至广告。Microsoft使用界面来推广自己的内容,

Linux下更新curl版本教程! Linux下更新curl版本教程! Mar 07, 2024 am 08:30 AM

在Linux下更新curl版本,您可以按照以下步骤进行操作:检查当前curl版本:首先,您需要确定当前系统中安装的curl版本。打开终端,并执行以下命令:curl--version该命令将显示当前curl的版本信息。确认可用的curl版本:在更新curl之前,您需要确定可用的最新版本。您可以访问curl的官方网站(curl.haxx.se)或相关的软件源,查找最新版本的curl。下载curl源代码:使用curl或浏览器,下载您选择的curl版本的源代码文件(通常为.tar.gz或.tar.bz2

Windows 11用户指南:如何禁用广告弹窗 Windows 11用户指南:如何禁用广告弹窗 Sep 22, 2023 pm 07:21 PM

Microsoft的Windows11操作系统可能会使用通知系统的计算机上定期将建议显示为弹出窗口。建议系统最初旨在为用户提供有关改进Windows11工作流程的提示和建议,现已几乎完全转变为推广Microsoft服务和产品的广告系统。建议的弹出窗口可能会向用户宣传Microsoft365订阅,建议将Android手机链接到设备,或设置备份解决方案。如果这些弹出窗口惹恼了您,您可以调整系统以完全禁用它们。以下指南提供了有关在运行Microosft的Windows11操作系统的设备上禁用弹出建议的

Java和WebSocket的结合:如何实现实时视频流播放 Java和WebSocket的结合:如何实现实时视频流播放 Dec 17, 2023 pm 05:50 PM

随着互联网技术的不断发展,实时视频流已经成为了互联网领域的一个重要应用。要实现实时视频流播放,其中的关键技术包括WebSocket和Java。本文将介绍如何结合使用WebSocket和Java实现实时视频流播放,并提供相关的代码示例。一、什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工通信的协议,它在Web

PHP Curl中如何处理网页的 301 重定向? PHP Curl中如何处理网页的 301 重定向? Mar 08, 2024 am 11:36 AM

PHPCurl中如何处理网页的301重定向?在使用PHPCurl发送网络请求时,时常会遇到网页返回的301状态码,表示页面被永久重定向。为了正确处理这种情况,我们需要在Curl请求中添加一些特定的选项和处理逻辑。下面将详细介绍在PHPCurl中如何处理网页的301重定向,并提供具体的代码示例。301重定向处理原理301重定向是指服务器返回了一个30

利用C++实现嵌入式系统的实时音视频处理功能 利用C++实现嵌入式系统的实时音视频处理功能 Aug 27, 2023 pm 03:22 PM

利用C++实现嵌入式系统的实时音视频处理功能嵌入式系统的应用范围越来越广泛,尤其在音视频处理领域的需求日益增长。面对这样的需求,利用C++语言实现嵌入式系统的实时音视频处理功能成为一种常见的选择。本文将介绍如何使用C++语言开发嵌入式系统的实时音视频处理功能,并给出相应的代码示例。为了实现实时音视频处理功能,首先需要理解音视频处理的基本流程。一般来说,音视频

桌面布局已锁定的原因及解决方法 桌面布局已锁定的原因及解决方法 Feb 19, 2024 pm 06:08 PM

显示桌面布局已锁定是怎么回事在使用计算机的过程中,有时我们可能会遇到显示桌面布局已锁定的情况。这个问题意味着我们无法自由地调整桌面图标的位置或改变桌面背景等操作。那么,显示桌面布局已锁定到底是怎么回事呢?一、理解桌面布局和锁定功能首先,我们需要了解桌面布局和桌面锁定这两个概念。桌面布局是指桌面上各个元素的排列方式,包括快捷方式、文件夹和小部件等。我们可以自由

如何让远程桌面连接显示对方的任务栏 如何让远程桌面连接显示对方的任务栏 Jan 03, 2024 pm 12:49 PM

远程桌面连接使用的用户非常多,很多用户在使用的时候都会遇到些小问题,比如没有显示对方的任务栏,其实很可能是对方的设置问题,下面就来看看解决方法吧。远程桌面连接怎么显示对方的任务栏:1、首先点击“设置”。2、然后再打开“个性化”。3、随后选择左侧的“任务栏”4、将图中隐藏任务栏选项关闭即可。

See all articles