【问题标题】:cURL Download Progress in PHP not working?PHP 中的 cURL 下载进度不起作用?
【发布时间】:2010-12-28 16:24:16
【问题描述】:

我是 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);

回调函数:

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

现在,我已经从 PHP 站点复制粘贴了这个示例,但这不起作用??我的 PHP 版本是 5.2.11,请。提出什么问题??

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

信息:我被 5.2.X 分支困住了,因为我的网络主机说 cPanel 还不支持 5.3.x 分支,有什么解决方案吗??

【问题讨论】:

  • 复制粘贴不是学习 PHP 或任何其他编程语言的方法。
  • 同意,我刚刚搜索并看到这个示例最终使用它 - 我认为这没有什么问题。 :)
  • 如果有人想使用此代码,请记住,在第一次或前几次调用中,$download_size 可以为零。因此,请确保在 $percent = $downloaded/$download_size 中缓存除以零错误,或者在计算前检查 $download_size > 0。

标签: php curl scripting


【解决方案1】:

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 看看是否可行。
  • 我被 5.2.X 分支困住了,因为我的网络主机说 cPanel 还不支持 5.3.x 分支,有什么解决方案吗??
  • 对了,回显后别忘了flush:php.net/manual/en/function.ob-flush.php
  • 如果不使用 curl 是可以接受的,流 api 也提供通知回调。它们从 php 5.2 开始可用。见编辑。
【解决方案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

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2016-05-08
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多