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 脚本运行时,无法显示任何内容。 如果我这样做<pre><?php for($i=0; $i < 10; $i++) sleep(1); echo "test $i <br>"; ob_flush(); flush();
,我会看到我的浏览器中每一秒都会多出一行。所以浏览器或php等到脚本完成再输出都不是真的。
php.net/flush 阅读描述,即使你得到了结果,也很少得到它——一些服务器和浏览器不支持它。如果你想编写代码,你希望它可以在每个浏览器和服务器上运行(也许除了 IE 6..)。
是的。很高兴知道更多关于这个问题的信息:) 你希望你可以传递一个标题左右来告诉浏览器直接输出,但我还没有找到任何东西。以上是关于php curl加载文件有进度的主要内容,如果未能解决你的问题,请参考以下文章