PHP cURL用于大内容和单个HTTP请求以获取字符串和MIME

5us2dqdw  于 2023-02-28  发布在  PHP
关注(0)|答案(1)|浏览(121)

我正在尝试使用cURL获取MIME Type和正文作为内容。在谷歌和Stackoverflow上检查后,我得到了多个代码,使此操作成功完成。但有一些混乱,选择最可靠,速度和单一的HTTP请求代码
1.从这些代码中选择哪一个最好。或者我们可以做得更好
1.我想要一个代码,使单一请求网站example.com
1.哪种代码适合从外部网站获取大量内容

代码1:

function file_get_contents_curl($url_curl) {
    $agent = $_SERVER['HTTP_USER_AGENT'];
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, 1); // include headers in response
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url_curl);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);   
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);   

    // Get the content type and content
    $response_curl = curl_exec($ch);
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    $data_curl = substr($response_curl, $header_size);

    // Set the content type header (MIME Type)
    header('Content-Type:' . $content_type);

    curl_close($ch);

    return $data_curl;
}

//full page 

$homepage = file_get_contents_curl("https://example.com");
echo $homepage;

代码2:

function file_get_contents_curl($url_curl){
    $agent_curl = $_SERVER['HTTP_USER_AGENT'];

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url_curl);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent_curl);

    $data_curl = curl_exec($ch);
    $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    curl_close($ch);

    return compact('data_curl', 'content_type');
}

$data_webpage = file_get_contents_curl("https://example.com");
$homepage = $data_webpage['data_curl'];
$content_type = $data_webpage['content_type'];
header('Content-Type:'.$content_type);
echo $homepage;

代码3:

function file_get_contents_curl($url) {
    $agent = $_SERVER['HTTP_USER_AGENT'];
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);   
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);   
    curl_setopt($ch, CURLOPT_VERBOSE, true);

    // Get the content type
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_exec($ch);
    $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    // Get the content
    curl_setopt($ch, CURLOPT_NOBODY, 0);
    $data = curl_exec($ch);
    curl_close($ch);

    // Set the content type header
    header('Content-Type:' . $content_type);

    return $data;
}

$homepage = file_get_contents_curl("https://example.com");
echo $homepage;
k0pti3hp

k0pti3hp1#

3个代码都使用cURL库来进行HTTP请求,看起来都能正常工作,但是每个代码都有不同的特性和方法,在不同的情况下可能会影响它们的可靠性和性能。
关于HTTP请求的数量,所有三个代码都向函数调用中指定的URL发出一个请求,因此,它们在这方面是等效的。
以下是每种代码的差异和潜在优势/劣势的简要概述:
代码1:

  • 在响应中包括标头。
  • 使用substr()从响应中提取数据。
  • 根据响应标头设置Content-Type标头。
  • 不单独存储内容类型。
  • 仅将响应正文作为字符串返回。

代码2:

  • 不在响应中包含标头。
  • 使用compact()以数组形式返回响应正文和Content-Type。
  • 单独存储内容类型。
  • 允许灵活地独立操作响应正文和内容类型。

代码3:

  • 在响应中包括标头。
  • 使用CURLOPT_NOBODY选项单独获取内容类型。
  • 根据响应标头设置Content-Type标头。
  • 以字符串形式返回响应正文。

在速度和可靠性方面,这三种代码的性能应该是相似的,因为它们使用相同的底层cURL库。但是,代码2和3可能比代码1稍有优势,因为它们显式提取Content-Type并单独存储,而不是依赖于解析响应头。

  • 总的来说 *,代码2和代码3更灵活,可能更适合需要对响应进行更多控制的复杂场景。代码1可能足以满足仅需要响应主体的简单用例。

相关问题