Le fichier PHP récupère le contenu () et définit les en-têtes de requête

Avec PHP, est-il possible d'envoyer des en-têtes HTTP avec file_get_contents() ?

Je sais que vous pouvez envoyer l'agent utilisateur à partir de votre fichier php.ini. Cependant, vous pouvez également envoyer d'autres informations telles que HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, et HTTP_CONNECTION avec file_get_contents() ?

Ou y a-t-il une autre fonction qui accomplira cela?

93
demandé sur Bogdan 2010-01-21 11:13:41

7 réponses

En fait, après une lecture plus approfondie sur la fonction 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);

Vous pourriez être en mesure de suivre ce modèle pour réaliser ce que vous cherchez à, je n'ai pas personnellement testé cela cependant. (et si cela ne fonctionne pas, n'hésitez pas à consulter mon autre réponse)

253
répondu Dominic Barnes 2017-05-11 14:34:23

Voici ce qui a fonctionné pour moi (Dominic était juste une ligne courte).

$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);
77
répondu Fabrice 2017-12-18 08:12:37

Vous pouvez utiliser cette variable pour récupérer les en-têtes de réponse après la fonction file_get_contents().

Code:

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

Sortie:

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"
}
37
répondu ali_sed 2017-08-24 11:18:36

L'utilisation des bibliothèques PHP cURL sera probablement la bonne solution, car cette bibliothèque a plus de fonctionnalités que le simple file_get_contents(...).

Un exemple:

<?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);
?>
1
répondu phidah 2010-01-21 08:21:03

Oui.

Lors de l'appel de file_get_contents sur une url, il faut utiliser la fonction stream_create_context, qui est assez bien documentée sur php.net

Ceci est plus ou moins exactement couvert sur la page suivante à php.net dans la section Commentaires de l'utilisateur: http://php.net/manual/en/function.stream-context-create.php

0
répondu Laereom 2012-10-24 09:00:46

Si vous n'avez pas besoin de HTTPS et curl n'est pas disponible sur votre système, vous pouvez utiliser fsockopen

Cette fonction ouvre une connexion à partir de laquelle vous pouvez à la fois lire et écrire comme vous le feriez avec un handle de fichier normal.

0
répondu AlexB 2012-10-24 09:03:47

Malheureusement, il ne semble pas que file_get_contents() offre vraiment ce degré de contrôle. L'extension cURL est généralement la première à apparaître, mais je recommande fortement L'extension PECL_HTTP ( http://pecl.php.net/package/pecl_http ) pour des requêtes HTTP très simples et directes. (il est beaucoup plus facile de travailler avec que cURL)

-2
répondu Dominic Barnes 2010-01-21 08:19:20