[CLI]使用Curl实现下载文件的实时进度条显示
前言
最近,在命令行下编程时,下载文件总是一个困难的过程。如果有进度条就更好了!
先去进度条的扩展包,还是不错的https://github.com/dariuszp/CLI-progress-bar(本地下载)
渲染:
还是挺好看的!
卷曲有什么用?
用php,curl主要是捕获数据,当然我们也可以用其他方法来捕获数据,比如fsockpen、file _ get _ contents等等。但只能抓住那些可以直接访问的页面,很难抓住有页面访问控制的页面或者登录后的页面。
卷曲使用
Curl是PHP非常常见的下载方式,这里使用简单;
//初始化curl $ ch=curl _ init();//设置请求的URL curl _ setopt($ ch,curl opt _ URL,$ URL);//curl_setopt($ch,CURLOPT_HEADER,0);//不直接输出,而是通过curl_exec返回curl _ setopt ($ ch,curl opt _ return transfer,1);if(false===($ stream=curl _ exec($ ch)){ throw new \ Exception(curl _ errno($ ch));} curl _ close($ ch);返回$ stream以上是一个非常简单的例子。如果一个文件非常大,那么用户需要等待很长时间。这时,我们应该添加进度条的效果:
请求类{受保护的$ bar//下载是否完整受保护$ downloaded=falsePublic function __construct() {//初始化一个进度条$ this-bar=new CLI进度条(100);$ this-bar-display();$ this-bar-setColorToRed();}函数下载($ URL){ $ ch=curl _ init();//从配置文件中获取根路径curl _ setopt ($ ch,curl opt _ URL,$ URL);curl_setopt($ch,CURLOPT_RETURNTRANSFER,0);//打开进度条curl _ setopt ($ ch,curl opt _ no progress,0);//进度条的触发函数curl _ setup($ ch,curl opt _ progress函数,‘progress’);//ps:如果目标网页跳转,也会跳转//curl _ setopt ($ ch,curl opt _ followlocation,true);if(false===($ stream=curl _ exec($ ch)){ throw new \ Exception(curl _ errno($ ch));} curl _ close($ ch);返回$ stream}/* * *进度条下载。* * @ param $ ch * @ param $ countdownloadsize总下载量* @param $currentDownloadSize当前下载量* @ param $countDownloadSize * @ param $ currenttuploadsize */public function progress($ ch,$ countDownloadSize,$ countDownloadSize,$ currenttploadsize){//当它等于0时,它应该在预读资源不等于0时开始下载。//这里的每一个判断都是一个坑。请尝试了解更多信息(0===$ countdowloadsize){ return false;}//有时候会下载两次,第一次很小,应该重定向下载如果($ countdownloadsize $ currentdownloadsize){ $ this-downloadsize=false;//继续显示进度条}//下载后,如果($ this-download){ return false,将再发送三个else请求;}//如果两边相等,下载不一定结束,否则If($ currentdownloadsize==$ countdownloadsize){ return false;}//开始计算$ bar=$ currentdownloadsize/$ countdownloadsize * 100;$ this-bar-progress($ bar);} }(new Request)-下载(' http://www . shiguo Peng.cn/database . SQL ');请注意下载回调的判断和那里的坑!
还有一个问题:如果跳转到下载并设置curl,返回的文件会出错。
我下载了一个zip文件,这将导致文件头中该请求的第一个HTTP响应头的内容。
所以你需要curl _ setopt ($ ch,curl opt _ followlocation,true);
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
版权声明:[CLI]使用Curl实现下载文件的实时进度条显示是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。