PHP file_get_contents () и настройки заголовков запросов

С PHP, можно ли отправлять HTTP-заголовки с file_get_contents() ?

Я знаю, что вы можете отправить пользовательский агент из вашего файла php.ini . Однако вы также можете отправить другую информацию, такую ​​как HTTP_ACCEPT , HTTP_ACCEPT_LANGUAGE и HTTP_CONNECTION с HTTP_CONNECTION file_get_contents() ?

Или есть еще одна функция, которая выполнит это?

Фактически, после дальнейшего чтения функции 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); 

Возможно, вы сможете следовать этой схеме, чтобы достичь того, к чему вы стремитесь, но я лично не проверял это. (и если он не работает, не стесняйтесь проверить мой другой ответ)

Вот что сработало для меня (Доминик был всего лишь одной строкой).

 $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" // ie An iPad ) ); $context = stream_context_create($options); $file = file_get_contents($url, false, $context); 

Вы можете использовать эту переменную для извлечения заголовков ответов после функции 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" } 

Использование библиотек 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); ?> 

Да.

При вызове file_get_contents на URL-адресе следует использовать функцию stream_create_context, которая достаточно хорошо документирована на php.net

Это более или менее точно описано на следующей странице php.net в разделе комментариев пользователей: http://php.net/manual/en/function.stream-context-create.php

Если вам не нужны HTTPS, и завиток в вашей системе недоступен, вы можете использовать fsockopen

Эта функция открывает соединение, из которого вы можете читать и писать так же, как и с обычным дескриптором файла.

К сожалению, это не похоже, что file_get_contents() действительно предлагает такую ​​степень контроля. Обычно расширение cURL является первым, но я настоятельно рекомендую расширение PECL_HTTP ( http://pecl.php.net/package/pecl_http ) для очень простых и простых HTTP-запросов. (с ней работать гораздо проще, чем cURL)