PHP中的cURL下载进度不起作用?

4

我是一名PHP新手,正在尝试使用以下方法向现有的PHP脚本添加进度条:

$ch=curl_init() or die("ERROR|<b>Error:</b> cURL Error");
curl_setopt($ch, CURLOPT_URL, $c);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_FILE, $fp);

//####################################################//
// This is required to curl give us some progress
// if this is not set to false the progress function never
// gets called
curl_setopt($ch, CURLOPT_NOPROGRESS, false);

// Set up the callback
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');

// Big buffer less progress info/callbacks
// Small buffer more progress info/callbacks
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
//####################################################//

curl_exec($ch);
curl_close($ch);
fclose($fp);

The callback function :

    function callback($download_size, $downloaded, $upload_size, $uploaded)
{
    $percent=$downloaded/$download_size;
  // Do something with $percent
  echo "$percent";      
}

现在,我从PHP网站上复制粘贴了这个例子,但它不起作用??我的PHP版本是5.2.11,请建议可能出了什么问题?

编辑:我正在从另一个脚本中调用此php脚本。

信息:由于我的Web主机表示cPanel尚不支持5.3.x分支,因此我被困在5.2.X分支中,是否有任何解决方案?


5
抄袭并不是学习PHP或任何其他编程语言的方式。 - Skilldrick
2
同意,我刚刚搜索了一下,看到这个例子最终使用了它 - 我认为这没有任何问题。:) - Stacked
如果有人想使用这段代码,请记住,在第一次或前几次调用时,$download_size 可能为零。因此,请确保您在 $percent = $downloaded/$download_size 进行除以零错误的缓存,或者在计算之前简单地检查 $download_size > 0。 - emrahgunduz
2个回答

8

在PHP 5.3之前似乎没有CURLOPT_PROGRESSFUNCTION。

请查看http://cvs.php.net/viewvc.cgi/php-src/ext/curl/interface.c?view=log,你会发现两个条目-[DOC]MFH:#41712, implement progress callback。一个是php5.3的版本,另一个是php6的分支。

编辑:使用PHP 5.2.x,您应该能够设置stream_notification_callback

function foo() {
  $args = func_get_args();
  echo join(', ', $args), "\n";
}

$ctx = stream_context_create(null, array('notification' =>'foo'));
$fpIn = fopen('http://php.net/', 'rb', false, $ctx);
file_put_contents('localfile.txt', $fpIn);

谢谢,我会请我的主机更新 PHP 并查看是否有效。 - Stacked
我被困在5.2.X分支上,因为我的网络主机说cPanel还不支持5.3.x分支,有什么解决办法吗? - Stacked
顺便提一下,在 echo 之后不要忘记执行 flush:php.net/manual/en/function.ob-flush.php - Pekka
1
如果不使用curl,流API也提供了通知回调函数。自PHP 5.2以来就可用。请参见编辑。 - VolkerK

2

关于上一个评论,所述的代码需要5.3,因为stream_context_create()的第二个参数是在5.3中添加的。然而,用以下代码替换该行可在5.2中工作:

$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));

另外,与此相关的新闻是,在PHP手册中的stream_notification_callback()文档中,有一个示例完全利用/创建了进度条,所以请查看。

http://php.net/stream_notification_callback


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接