php curl加载文件有进度

Posted

技术标签:

【中文标题】php curl加载文件有进度【英文标题】:Php curl load file with progress 【发布时间】:2014-04-30 07:39:33 【问题描述】:

我正在尝试通过 php curl 下载一些文件并向用户显示 complete persents。 我在 Google 上搜索了很多示例,但没有人会为我工作。

例如,我们将使用此代码。

echo "<pre>";
echo "Loading ...";

ob_flush();
flush();

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://***.com");
//curl_setopt($ch, CURLOPT_BUFFERSIZE,128);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress');
curl_setopt($ch, CURLOPT_NOPROGRESS, false); // needed to make progress function work
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
$html = curl_exec($ch);
curl_close($ch);


function progress($resource,$download_size, $downloaded, $upload_size, $uploaded)

    if($download_size > 0)
         echo $downloaded / $download_size  * 100;
    ob_flush();
    flush();
    sleep(1); // just to see effect


echo "Done";
ob_flush();
flush();

全部都在 index.php 文件中。但是当我试图执行这个文件时,它只会加载一段时间(http://take.ms/LlnUv)然后显示百分比。但它应该在下载文件时显示这些百分比,而不是在下载后显示,因为之后我不再需要它了。

Loading ...7.5311205259867.53112052598615.19270877173315.19270877173322.8542970174822.8542970174830.51588526322730.51588526322738.17747350897438.17747350897445.83906175472145.83906175472153.50065000046853.50065000046861.16223824621561.16223824621568.82382649196168.82382649196176.48541473770876.48541473770884.14700298345584.14700298345591.80859122920291.80859122920299.47017947494999.470179474949100100100100Done

也在尝试使用该 (https://github.com/JokerHacker/CurlAxel) 库。但它也不适合我。

我做错了什么?谢谢

【问题讨论】:

您在什么操作系统上运行 XAMPP?你用什么浏览器测试它?因为我已经在我的 WAMP 服务器上运行了这段代码,并用 IE 和 Chrome(在 Windows 上)对其进行了测试,它几乎可以像宣传的那样工作。 (除了由于某种原因我的进度函数只需要 4 个参数并且缺少资源一个) 它在 Firefox 中不起作用。 (所以我猜那是你的浏览器。) 【参考方案1】:

PHP 将读取整个输出并在所有脚本完成后显示给您。这就是为什么您在下载过程之后看到所有内容的原因。所以,你可以做什么?例如,您可以在文件或数据库中记录您的进度,然后通过 javascript 在网站上读取它。此外,在您的函数中使用 sleep 只会减慢整个执行速度,它并没有按您的预期工作。

【讨论】:

冲洗不应该阻止这种情况吗?刷新应该告诉 PHP 输出到那时为止的所有内容。 技术上是的,但是浏览器显示全部或不显示。所以这意味着 ob_flush() 或 flush() 没有影响,因为当 php 脚本运行时,无法显示任何内容。 如果我这样做&lt;pre&gt;&lt;?php for($i=0; $i &lt; 10; $i++) sleep(1); echo "test $i &lt;br&gt;"; ob_flush(); flush();,我会看到我的浏览器中每一秒都会多出一行。所以浏览器或php等到脚本完成再输出都不是真的。 php.net/flush 阅读描述,即使你得到了结果,也很少得到它——一些服务器和浏览器不支持它。如果你想编写代码,你希望它可以在每个浏览器和服务器上运行(也许除了 IE 6..)。 是的。很高兴知道更多关于这个问题的信息:) 你希望你可以传递一个标题左右来告诉浏览器直接输出,但我还没有找到任何东西。

以上是关于php curl加载文件有进度的主要内容,如果未能解决你的问题,请参考以下文章

如何将 curl 上传进度发送到要显示的 ajax

Shell脚本curl在stderr上输出进度[重复]

如何让 cURL 不显示进度条但仍提供统计信息?

shell curl显示进度条

shell curl显示进度条

php上传文件进度条