如何与 PHP 并行进行 cURL 下载和输出?
Posted
技术标签:
【中文标题】如何与 PHP 并行进行 cURL 下载和输出?【英文标题】:How do I do cURL download and output in parallel with PHP? 【发布时间】:2012-11-20 20:15:48 【问题描述】:我尝试使用 php 进行下载重定向。 我正在通过另一个服务器获取文件
例如:http://rarlab.com/rar/wrar420.exe
我想要脚本将文件保存为临时变量,同时他保存, 他将其作为下载发送到浏览器...
function download($url,$name,$hash)
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$data = curl_exec($ch);
curl_close($ch);
header('Content-Description: File Transfer');
header("Content-Disposition: attachment; filename=".$name);
ob_clean();
flush();
readfile($url);
download("http://rarlab.com/rar/wrar420.exe","winrar.rar","26digitHASH");
谢谢你们。
【问题讨论】:
它是,我希望它同时完成,真正发生的是:发出 curl 请求,完成后,发送下载.. 我认为添加这个是一个真正的问题......而且是一个相当普遍的问题......和一个有趣的技术:“我”投票支持重新开放。 【参考方案1】:您尝试做的几乎超出了 PHP 的范围,但由于 cURL 实现的多句柄特性,它应该是可能的。
请参阅curl_multi_exec() 的文档了解如何使用多手柄功能。
根据this answer可以在传输完成之前调用curl_multi_getcontent():
//execute the handles
do
$mrc = curl_multi_exec($mh, $active);
while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK)
if (curl_multi_select($mh) != -1)
do
$mrc = curl_multi_exec($mh, $active);
while ($mrc == CURLM_CALL_MULTI_PERFORM);
// echo the contents downloaded so far
// Note that this must be called with the curl handle, not with the multi handle.
echo curl_multi_getcontent($ch);
flush();
【讨论】:
emm 看起来不错,但我只需要 1 个 curl 请求,如何将它与我的函数混合使用? 您需要创建一个多手柄,即使您只将单个 curl 手柄链接到它。在您的 pastebin 中,您 curl_exec 和 curl_close 您的 curl 句柄 - 不要这样做,多句柄会为您执行此操作。 哦,它的工作,但下载速度很慢.. 我该怎么做才能让它更快? (得到根)。 测量,测量,测量。什么是慢?观察 CPU 负载。使用微秒时间戳和下载的字节制作日志。 你在那里做什么...只发送一次header
s,删除readfile
和ob_clean
并了解他们的工作。尝试下载 1) 不带 curl_multi_getcontent($ch)
,然后 2) 带 curl_multi_getcontent($ch);
但不带 echo
和 flush()
。以上是关于如何与 PHP 并行进行 cURL 下载和输出?的主要内容,如果未能解决你的问题,请参考以下文章
PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比