PHP file_get_contents()和设置请求标头

时间:2010-01-21 08:13:42

标签: php header

使用PHP,是否可以使用file_get_contents()发送HTTP标头?

我知道您可以从php.ini文件中发送用户代理。但是,您是否还可以使用HTTP_ACCEPT发送HTTP_ACCEPT_LANGUAGEHTTP_CONNECTIONfile_get_contents()等其他信息?

或者还有其他功能可以实现这一目标吗?

7 个答案:

答案 0 :(得分:285)

实际上,在进一步阅读file_get_contents()函数时:

// Create a stream
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

您可以按照这种模式来实现您的目标,但我没有亲自测试过。 (如果它不起作用,请随时查看我的其他答案)

答案 1 :(得分:83)

这对我有用(Dominic只有一行)。

$url = "";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);

答案 2 :(得分:37)

您可以使用此变量在file_get_contents()函数后检索响应标头。

代码:

  file_get_contents("http://example.com");
  var_dump($http_response_header);

输出:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; charset=UTF-8"
}

答案 3 :(得分:0)

在url上调用file_get_contents时,应使用stream_create_context函数,该函数在php.net上有详细记录

在用户评论部分的php.net上,或多或少地完全涵盖了这一点:http://php.net/manual/en/function.stream-context-create.php

答案 4 :(得分:-1)

使用php cURL库可能是正确的方法,因为这个库有比简单file_get_contents(...)更多的功能。

一个例子:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>

答案 5 :(得分:-1)

如果您不需要HTTPS并且系统上没有curl,您可以使用fsockopen

此函数打开一个连接,您可以像使用普通文件句柄一样进行读取和写入。

答案 6 :(得分:-3)

不幸的是,它看起来并不像file_get_contents()真正提供那种程度的控制。 cURL扩展通常是第一个出现,但我强烈建议使用PECL_HTTP扩展(http://pecl.php.net/package/pecl_http)来处理非常简单和直接的HTTP请求。 (它比cURL更容易使用)