在我的CURL CURLOPT_PROGRESSFUNCTION回调中,dltotal始终为0

vddsk6oq  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(211)

我通过CURLOPT_PROGRESSFUNCTION选项成功地调用了我在PHP中的成员函数。dlnow变量返回了正确的接收值,但dltotal总是返回0。我在这里遗漏了什么?

class MyClass {

    function getFile(){

    ...

      $fp = fopen ($file, 'w+');
      $curl = curl_init();
      curl_setopt($curl,CURLOPT_URL,$signed['signed_url']);
      curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
      curl_setopt($curl, CURLOPT_FILE, $fp); // write curl response to file
      curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($curl, CURLOPT_NOPROGRESS, 0);
      curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, array($this, 'curl_progress_callback'));

    }

    function curl_progress_callback($dltotal, $dlnow, $ultotal, $ulnow){
        echo $dltotal; //Reports correct value
        echo $dlnow;   //Always returns 0
    }

}

字符串

  • 编辑:这篇文章已经更新了来自@Sabuj哈桑的信息。最初我以为我收到了正确的dltotal,但不正确的dlnow,但我在回调函数中有一个额外的不必要的参数。*
gt0wga4j

gt0wga4j1#

注意:对于早于7.32.0的libcurl
回调函数需要具有以下格式

curl_progress_callback($resource,$dltotal, $dlnow, $ultotal, $ulnow)

字符串
因为较新的curl二进制文件不需要资源

curl_progress_callback($dltotal, $dlnow, $ultotal, $ulnow)


检查你的curl版本

curl -V

5cnsuln7

5cnsuln72#

尝试删除类:

curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, 'curl_progress_callback');

字符串
然后从callback中删除第一个参数。

function curl_progress_callback($dltotal, $dlnow, $ultotal, $ulnow){
   ...
}

UPDATE:一个工作代码:尝试从您的终端运行它。

function getFile(){
  $fp = fopen ("output.html", 'w+');
  $curl = curl_init();
  curl_setopt($curl,CURLOPT_URL,'http://www.mashable.com/');
  curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
  curl_setopt($curl, CURLOPT_FILE, $fp);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($curl, CURLOPT_NOPROGRESS, 0);
  curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, 'curl_progress_callback');

  $result = curl_exec($curl);
  fclose($fp);

}

function curl_progress_callback($dltotal, $dlnow, $ultotal, $ulnow){
    echo "$dltotal\n";
    echo "$dlnow\n";
}

getFile();

az31mfrm

az31mfrm3#

我们可以简化为

curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,
            static function ($dltotal, $dlnow, $ultotal, $ulnow){
                print_r([$dltotal, $dlnow, $ultotal, $ulnow]);
            });

字符串
甚至以下是跨版本兼容的。

curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,
            static function (...$args){
                print_r($args);
            });


最后,

curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,
            static fn(...$args) => print_r($args));

flmtquvp

flmtquvp4#

问题似乎是我请求的网站没有发送http content-length,所以dltotal总是空的。感谢@Subuj哈桑纠正了我在curl_progress_callback中的错误,这个错误有太多的值,让我最初认为问题是dlnow值。

wnvonmuf

wnvonmuf5#

使用CURLOPT_XFERINFOFUNCTION回调:-

curl_setopt($ch, CURLOPT_XFERINFOFUNCTION,  function( $source, $download_size, $downloaded, $upload_size, $uploaded){
     //code here        
  });

字符串

相关问题