Version complète: sur le forum Webmaster Hub : Php et curl
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Imp
Bonjour

J'ai besoin d'utiliser curl ou wget pour récupérer le contenu d'un page web dans une variable (à cause d'une histoire de cookie)

Pour l'instant j'utilise ceci (qui fonctionne bien) :
CODE
<?php
$url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=682";
$cookies="/tmp/cookies.txt";

shell_exec('curl -D '.$cookies.' -L "'.$url.'"');
$page=shell_exec('curl -s -b '.$cookies.' -L "'.$url.'"');
?>


Mais j'ai du mal à faire l'équivalent en code purement PHP (qui m'a l'air bien plus compliqué !!), sans passer par shell.
http://fr.php.net/curl

Est-ce que quelqu'un pourrait m'aider à le faire ?

Sinon est-ce qu'il y a une réelle différence en terme de rapidité en passant par shell_exec ou ça n'a guère d'importance ?

Merci d'avance
Kioob
Bonjour,

qu'est ce que tu n'arrives pas à faire avec la version PHP ? Le principe est sensiblement le même... une URL, des options, puis l'exécution.

Pour ce qui est de la différence de performances, oui elle peut être importante... mais tout est relatif : si c'est pour un cron lancé une fois par heure, voir même toutes les minutes, tu ne verras très certainement pas la différence.
D'autant plus que le goulet d'étranglement pour ce genre de traitement est bien souvent le site web en face.



PS : dans ton exemple tu fais deux fois le "shell_exec", je suppose que c'est une erreur, non ?
Imp
CITATION(Kioob @ mardi 15 avril 2008 à 14:27) *
PS : dans ton exemple tu fais deux fois le "shell_exec", je suppose que c'est une erreur, non ?

Le premier sert à créer le fichier cookies.txt dont la deuxième commande à besoin pour que je récupère le bon contenu.
CITATION
-D/--dump-header <file>
Write the protocol headers to the specified file.

This option is handy to use when you want to store the headers
that a HTTP site sends to you. Cookies from the headers could
then be read in a second curl invoke by using the -b/--cookie
option! The -c/--cookie-jar option is however a better way to
store cookies.


Mais c'est vrai que je pourrais faire la même chose en une fois :
CODE
$page=shell_exec('curl -D '.$cookies.' -L "'.$url.'"; curl -s -b '.$cookies.' -L "'.$url.'"');



Le problème ? Bah je trouve ça compliqué. Déjà pour trouver les options vraiment équivalentes.
L'option -b ne semble pas correspondre exactement à CURLOPT_COOKIEFILE , car avec le code suivant :
CODE
<?php
$url="http://www.canalplus.fr/c-humour/pid2053-c-encore-de-rire.html?catId=682";
$cookies="/tmp/cookies.txt";

$a = curl_init ($url);
$header_file = fopen ($cookies, "w");
curl_setopt ($a, CURLOPT_WRITEHEADER, $header_file);
curl_setopt($a, CURLOPT_FOLLOWLOCATION, 1);
curl_exec ($a);
curl_close($a);

$b = curl_init ($url);
curl_setopt($b, CURLOPT_COOKIEFILE, $cookies);
curl_setopt($b, CURLOPT_FOLLOWLOCATION, 1);
$page = curl_exec($b);
curl_close($b);

?>

le fichier cookies.txt (qui en fait contient les entêtes HTTP) est correct (identique qu'avec -D), mais apparemment ce n'est pas bien exploité comme avec -b car je n'obtiens pas le bon résultat (normalement le contenu de $page doit-être la page de la vidéo de stéphane Guillon, et quand ce n'est pas bon, c'est Thomas Ngijol)

Je vais plutôt regarder du côté de cookie-jar...
Imp
Bon finalement je suis arrivé à avoir le bon résultat (et sans passer par un fichier) :
CODE
<?php

$c = curl_init($url);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($c, CURLOPT_HEADER, 1);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$headers = curl_exec($c);
curl_close($c);

preg_match('/.*^Set-Cookie: ([^;]+)/sm',$headers,$cookie);

$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_COOKIE, $cookie[1]);
$page = curl_exec($c);
curl_close($c);

?>


Si je reprends le shell_exec avec une syntaxe condensée et en utilisant un tube au lieu d'un fichier, ça peut se résumer à ça :
CODE
$page=shell_exec("curl -sLD - $url | curl -sb - $url");

Vu qu'il faut écrire dix fois plus de code en "pur" php, je crois que je vais en rester à shell_exec.
Le but est de me fabriquer mes propres flux rss.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.