如何与 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 负载。使用微秒时间戳和下载的字节制作日志。 你在那里做什么...只发送一次headers,删除readfileob_clean 并了解他们的工作。尝试下载 1) 不带 curl_multi_getcontent($ch),然后 2) 带 curl_multi_getcontent($ch); 但不带 echoflush()

以上是关于如何与 PHP 并行进行 cURL 下载和输出?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比

串行输入输出和并行输入输出的区别解析

PHP 利用 curl 实现多进程下载文件类

PHP 并行 curl 请求

PHP AyeEmtract - 并行实现Curl以提取电子邮件地址的PHP类

使用PHP的cURL库进行网页抓取