Facebook LinkedIn SourceForge Twitter RSS LastFM
logologo

Récupérer les en-têtes HTTP en PHP avec la lib cURL

Geoffray Warnants|13/12/2008|10 commentaires

Voulant une fois pour toutes pouvoir grer correctement les appels des pages distantes via HTTP, j'ai dcid de me pencher sur la librairie cURL. Une des premires tapes que je souhaitais accomplir tait d'extraire les en-ttes HTTP afin d'obtenir une indication sur le droulement de la requte HTTP demande. Une premire approche permet de raliser ceci trs simplement grce l'option de transmission CURLOPT_HEADER :

<?php
$url = curl_init();
curl_setopt($url, CURLOPT_URL, 'http://www.google.com');
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($url, CURLOPT_HEADER, true);

$page = curl_exec($url);
curl_close($url);
?>

L'inconvnient majeur de cette mthode est que les en-ttes HTTP et le contenu de la page demande se retrouvent concatns dans le rsultat de curl_exec(). Effectuer une dcomposition manuelle du rsultat obtenu pourrait fournir le rsultat attendu, mais c'est alors omettre une solution plus propre offerte par la librairie. Elle propose en effet un mcanisme de fonctions "callbacks" appeles lorsqu'un vnement particulier se produit. Dans le cas qui nous intresse ici, l'option CURLOPT_HEADERFUNCTION permet d'appeler une fonction chaque en-tte HTTP rencontr. Attention que cette fonction doit absolument retourner le nombre d'octets de l'en-tte reu en paramtre.

<?php
function read_header($url, $str) {
    echo 'Header : '.$str."\n";
    return strlen($str);
}

$url = curl_init();
curl_setopt($url, CURLOPT_URL, 'http://www.google.com');
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($url, CURLOPT_HEADER, true);
curl_setopt($url, CURLOPT_HEADERFUNCTION, 'read_header');

$page = curl_exec($url);
curl_close($url);
?>

Sur base de ce principe, on peut alors se construire rapidement une petit classe, histoire d'encapsuler ces traitements dans un objet :

<?php
/**
 * A sample class to read HTTP headers
 * @author Geoffray Warnants - http://www.geoffray.be
 */
class HTTPReader {
    protected $_url = null;
    protected $_headers = array();
    protected $_body = '';
    
    public function __construct($url) {
        $this->_url = curl_init($url);   
        curl_setopt($this->_url, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($this->_url, CURLOPT_HEADER, true);
        curl_setopt($this->_url, CURLOPT_HEADERFUNCTION,
            array($this, 'readHeaders')
        );
    }
    public function __destruct() {
        curl_close($this->_url);
    }
    public function getHeaders() {
        $this->_body = curl_exec($this->_url);
        return $this->_headers;
    }
    public function getBody() {
        return $this->_body;
    }
    protected function readHeaders($url, $str) {
        if (strlen($str) > 0) {
            $this->_headers[] = $str;
        }
        return strlen($str);
    }
}
?>

<<< Retour

Vos commentaires

10 commentaires posts

Pete
24/03/2021 03:26Post par Pete
It's awesome to pay a quick visit this website and reading the
views of all friends about this post, while I am also eager of getting experience.
Joy Schmitt
18/01/2021 18:10Post par Joy Schmitt
Pour quelqu?un qui a l?angoisse des math?matiques, je crois que ceci va lui faire mal ? la t?te. Perso, je ne fais que vous encourager les amies dans votre travail en tant qu?une simple spectatrice.
f4b1
12/09/2016 10:08Post par f4b1
Merci pour cette astuce, j'étais justement en train de chercher comment faire et je suis tombé sur ton article, simple et clair !
Aurélien
19/04/2013 14:17Post par Aurélien
Pratique.

A bookmarquer.

PS : merci Seebz et Charles pour les compléments.
gilles
08/09/2011 15:45Post par gilles
Cool!!! Enfin un exemple qui ne nous fait pas passer par Mars pour obtenir le résultat voulu ;)
NICKEL
Charles
10/02/2011 01:54Post par Charles
Seebz a raison, faisons simple :

file_get_contents("http://www.mapage.fr");
foreach ($http_response_header as $i)
{
echo '<br>'.$i ;
}
Seebz
10/11/2010 22:53Post par Seebz
Une méthode plus simple est d'utiliser la variable prédéfinie `$http_response_header`

Exemple :

<?php file_get_contents("http://example.com");
var_dump($http_response_header);
Thera
03/08/2010 16:59Post par Thera
Exactement ce que je cherchais et avec un exemple clair et simple en plus, parfait :)
Guillaume
11/02/2010 18:42Post par Guillaume
Merci, ca m'a bien aidé !
joshua
14/01/2009 10:18Post par joshua
c koi ton blog on y compren ke dal

Ragir cet article

*


(Ne sera pas publie, servira uniquement afficher votre gravatar)


(Lien en dur et dofollow)

zend framework