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

Php 在我的CURL CURLOPT_PROGRESSFUNCTION回调中,dltotal始终为0,php,curl,callback,Php,Curl,Callback,我通过CURLOPT_PROGRESSFUNCTION选项得到了一个CURL进程回调函数,它在PHP中成功地调用了我的成员函数。dlnow变量返回正确的接收值,但dltotal始终返回0。我错过了什么 class MyClass { function getFile(){ ... $fp = fopen ($file, 'w+'); $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$s

我通过CURLOPT_PROGRESSFUNCTION选项得到了一个CURL进程回调函数,它在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 Hassan的信息。最初我以为收到的是正确的dltotal,但现在收到的是错误的dlnow,但我的回调函数中有一个额外的不必要的参数。

尝试删除该类:

curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, 'curl_progress_callback');
然后从
回调中删除第一个参数

function curl_progress_callback($dltotal, $dlnow, $ultotal, $ulnow){
   ...
}
更新:工作代码:尝试从您的终端运行它

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();

问题似乎是我请求的网站没有发送http内容长度,因此dltotal总是空的。感谢@Subuj Hassan纠正了我在curl\u progress\u回调中的错误,该回调的值太多,使我最初认为问题出在dlnow值上。

注意:对于早于7.32.0的libcurl

回调函数需要以下格式

curl_progress_callback($resource,$dltotal, $dlnow, $ultotal, $ulnow)
其中,较新的curl二进制文件不需要资源

curl_progress_callback($dltotal, $dlnow, $ultotal, $ulnow)
使用检查卷曲版本

curl -V

移除类不起作用-调用中包含类的数组对于调用回调是至关重要的,因为我们在类函数中。那部分很好用。问题是CURL没有将任何数据发送回参数中。删除第一个参数后,我能够得到一些url的响应,但其他url没有响应-这可能是由什么决定的?我收到了$dlnow值,但$dltotal始终为0。如果它有效,那么它应该适用于每个url。可能是你做错了什么。使用新版本的代码更新您的问题。我怀疑发送网站没有向我发送内容长度,这就是为什么我没有始终获得dltotal。我的新代码的唯一区别是删除了回调的第一个参数,如您所示。@Oddible请检查更新的答案,并尝试从您的角度运行它。您确定这些版本和格式不是相反的方式吗?即使是实际的curl文档似乎也希望将资源句柄传递给回调。在curl 7.26中,当传递$resource时,我会得到一个缺少的参数,但在7.35中我没有。在libcurl/7.19.7和php5.6.3中,包含了resource参数。您是如何理解的,在哪里读到新libcurl中的第一个(resource)参数?我明白了,这个函数中还有5个参数。因此,在我的PHP5.6.2、libcurl 7.42.1、Win7x64中,还有5个参数正在执行calback函数,第一个参数是resource。。在哪种情况下只有4个参数?PHP文档说额外的参数是在PHP5.5.0中添加的。“5.5.0.将cURL资源作为第一个参数添加到CURLOPT_PROGRESSFUNCTION回调。”