PHP获取curl传输进度

492人阅读 评论(0) 收藏 举报
分类:

curl上传或者下载,有以下2个选项:

CURLOPT_NOPROGRESS => false,
CURLOPT_PROGRESSFUNCTION => 'callback',

CURLOPT_NOPROGRESS:是否关闭传输进度,默认是true。

CURLOPT_PROGRESSFUNCTION:回调函数,curl传输过程中,会每隔一段时间自动调用该函数。我测试过,间隔不到1秒,具体不知道。官方的注释是这样:设置一个回调函数,有五个参数,第一个是cURL的资源句柄,第二个是预计要下载的总字节(bytes)数。第三个是目前下载的字节数,第四个是预计传输中总上传字节数,第五个是目前上传的字节数。
(注意回调函数的命名空间。如:CURLOPT_PROGRESSFUNCTION => ‘namespace_xxx\callback’)

设置完成后,需要定义回调函数:

function callback($resource, $downloadSize = 0, $downloaded = 0, $uploadSize = 0, $uploaded = 0)
{
    // php5.5之前的参数是不同的,所以要考虑到兼容性
    if (version_compare(PHP_VERSION, '5.5.0') > 0) {
        $info = array(
            'downloadSize' => $downloadSize,
            'downloaded'   => $downloaded,
            'uploadSize'   => $uploadSize,
            'uploaded'     => $uploaded,
        );
    } else {
        $info = array(
            'downloadSize' => 0,
            'downloaded'   => 0,
            'uploadSize'   => $downloaded,
            'uploaded'     => $uploadSize,
        );
    }

    S('file_upload_' . session('user_auth.uid'), $info, 300); // 可以将结果存放到缓存(这里是ThinkPHP例子)
} 

重要:
在curl发起请求时,如果开启了session,会独占session,阻塞其他的请求。所以如果框架默认启用了session,在curl之前可以用session_write_close()函数关闭session阻塞。
参考:http://www.cnblogs.com/skillCoding/archive/2012/04/09/2439296.html

最后:在进行传输时,可以每隔1秒通过ajax来获取缓存信息,从而显示传输进度。

补充:
传送大文件时,php会超时,注意设置php-fpm.conf中的request_terminate_timeout值,我设了1000(秒)。
还有个max_children(进程数) ,进程不够用可改大。
在程序中,可以使用set_time_limit()临时增加php响应时间。
php.ini中还有max_execution_time设置,看攻略说是跟 set_time_limit累加的,如果攻略是对的,那么这个不用管。

查看评论

php curl 实现文件上传

/** * @param string $url 请求地址 * @param string $filePath 上传文件的绝对路径 * @param array $pos...
  • qq_21119513
  • qq_21119513
  • 2017-06-13 14:11:29
  • 189

libcurl 通过http协议下载文件并显示下载进度

vc6 测试工程下载地址:  代码如下: size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stre...
  • mtour
  • mtour
  • 2014-10-22 14:22:51
  • 2502

php curl 下载文件

/** * @param string $img_url 下载文件地址 * @param string $save_path 下载文件保存目录 * @param string $filename...
  • u010957293
  • u010957293
  • 2016-09-25 19:36:02
  • 3623

php curl请求接口并获取数据

当我们在做php开发的时候,很多时候需要对接口进行测试,或者更方便的调用一些已有模块的接口,取到结果并进行后续操作,我们可以通过curl进行模拟提交post和get请求,来去实现这些功能。 下面是对c...
  • wyfhist
  • wyfhist
  • 2015-07-21 13:28:00
  • 16464

PHP的cURL扩展的各类响应时间

说实话,PHP官方手册对CURL的几个响应时间说明,如total_time、namelookup_time等,十分之模糊,让人摸不着头脑。这篇博文特此图文详细说明了这几个常用的响应时间,为了需要用到这...
  • BlackButton_CC
  • BlackButton_CC
  • 2017-06-19 20:47:23
  • 715

libcurl--下载文件并实现进度条

昨天使用了windows api实现了下载文件以及显示下载进度:Windows客户端开发–URLDownloadToFile下载文件进度条今天就来说一使用libcurl实现http下载,并实现进度条。...
  • wangshubo1989
  • wangshubo1989
  • 2016-10-23 15:37:39
  • 9175

PHP通过CURL下载文件

  • 2017年02月24日 11:09
  • 818B
  • 下载

libcurl获取下载进度百分比,下载速度,剩余时间

如果希望获取下载或者上传进度相关信息,就给CURLOPT_NOPROGRESS属性设置0值 int ret = curl_easy_setopt(easy_handle, CURLOPT_URL, "...
  • ixiaochouyu
  • ixiaochouyu
  • 2015-08-05 18:32:50
  • 5215

curl命令详解

对于windows用户如果用Cygwin模拟unix环境的话,里面没有带curl命令,要自己装,所以建议用Gow来模拟,它已经自带了curl工具,安装后直接在cmd环境中用curl命令就可,因为路径已...
  • testcs_dn
  • testcs_dn
  • 2015-02-26 07:31:35
  • 3556

使用libcurl实现的下载器,取消下载

转载文章  http://blog.csdn.net/robertbaker/article/details/43703907 转载文章   http://blog.csdn.net/infoworl...
  • xiaojun111111
  • xiaojun111111
  • 2016-11-04 10:07:47
  • 2146
    个人资料
    持之以恒
    等级:
    访问量: 9120
    积分: 266
    排名: 29万+
    文章分类
    文章存档
    最新评论