2009-12-21 121 views
4

我是一个PHP新手,尝试使用下面的方法添加一个进度条到现有的PHP脚本:cURL下载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分支,任何解决方案?

+5

复制粘贴不是学习PHP或任何其他编程语言的方式。 – Skilldrick 2009-12-21 09:15:20

+2

同意,我只是搜索,看到这个例子结束使用它 - 我不认为这有什么问题。 :) – Stacked 2009-12-21 09:20:45

+0

如果有人想使用此代码,请记住,在第一次或前几个调用中,$ download_size可以为零。因此,请确定您在$ percent = $ downloaded/$ download_size中缓存了除零错误的分区,或者只需在计算之前检查$ download_size> 0。 – emrahgunduz 2014-06-06 13:02:13

回答

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); 
+0

谢谢,我会问我的主机更新PHP,看看这是否工作。 – Stacked 2009-12-21 10:15:28

+0

我与5.2.X分支卡住,因为我的网络主机说cPanel不支持5.3.x分支,任何解决方案? – Stacked 2009-12-21 13:40:39

+0

顺便说一句,不要忘了在echo后输入'flush':php.net/manual/en/function.ob-flush.php – 2009-12-21 13:41:45

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