【问题标题】:Handle CURL headers before downloading body在下载正文之前处理 CURL 标头
【发布时间】:2010-12-23 09:53:15
【问题描述】:

使用 PHP 和 CURL(除非在这种情况下有比 CURL 更好的替代方案),是否可以在下载文件之前让 php 函数处理标头响应?

例如:

我有一个脚本,可以下载和处理用户提供的 url。我想添加一个检查,以便如果文件对我的进程无效(不是文本文件、太大等),CURL 请求将在服务器浪费时间下载文件之前被取消。

更新:解决方案 PEAR 类 HTTP_Request2:http://pear.php.net/package/HTTP_Request2/ 使您能够为连接设置观察者并随时抛出异常以取消。完美满足我的需求!

【问题讨论】:

  • 我确实在 cURL "CURLOPT_HEADERFUNCTION" 中找到了一个选项,可让您为标头设置回调函数,但是您无法从回调内部取消请求。您收到错误消息:“尝试从回调中关闭 cURL 句柄”
  • 在良好的编程设计中,永远不应该为“正常”操作抛出异常,因为通常异常在算法上是昂贵的。它们应该只用于很少发生的操作,例如错误或不正确的行为。
  • 要在为CURLOPT_HEADERFUNCTION 或其他CURLOPT_*FUNCTION 选项定义的回调函数中中止下载响应流,只需让您的回调返回-1

标签: php curl


【解决方案1】:

使用 cURL,执行 HTTP HEAD 请求来检查标头,然后如果有效(状态为 200)执行完整的 HTTP GET 请求。

您必须设置的基本选项是CURLOPT_NOBODY,它将请求的类型更改为HEAD

curl_setopt($ch, CURLOPT_NOBODY, true);

然后执行查询后,需要检查返回状态,可以使用curl_getinfo()来完成

$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

【讨论】:

  • 没有。它准确地解释了如何做到这一点。
  • 确实如此,但必须为每个 url 发送两个请求/连接似乎很浪费。
  • 当内容类型不匹配时发出 GET 请求只是为了丢弃正文可能更浪费,因为您不应该中止请求(这就是 HEAD 方法存在的原因)。
【解决方案2】:

我知道这是一个老话题,但以防万一人们将来来到这里。

使用 CURL,您可以使用CURLOPT_WRITEFUNCTION,它可以让您放置一个回调,该回调将在正文响应开始出现并需要编写时立即调用。在那一刻,您可以阅读标题并取消该过程,并且不会下载正文。一站式请求。

如需更深入的了解和代码示例,请参阅PHP/Curl: inspecting response headers before downloading body

【讨论】:

    【解决方案3】:

    这是一个如何解决它的示例:

    // Include the Auth string in the headers
    // Together with the API version being used
    $headers = array(
        "Authorization: GoogleLogin auth=" . $auth,
        "GData-Version: 3.0",
    );
    
    // Make the request
    curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full");
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    
    $response = curl_exec($curl);
    curl_close($curl);
    
    // Parse the response
    $response = simplexml_load_string($response);
    
    // Output data
    foreach($response->entry as $file)
    {
           //now you can do what ever if file type is a txt
            //if($file->title =="txt")
            // do something
            else
            // do soething
        echo "File: " . $file->title . "<br />";
        echo "Type: " . $file->content["type"] . "<br />";
        echo "Author: " . $file->author->name . "<br /><br />";
    }
    

    【讨论】:

    • 除了标题之外还下载 url 的正文。关键是获取标题,然后如果需要,可以选择在正文之前停止连接。
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多