Aller au contenu

Php et curl


Imp

Sujets conseillés

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) :

<?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

Modifié par Imp
Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

-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 :

$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 :

<?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...

Modifié par Imp
Lien vers le commentaire
Partager sur d’autres sites

Bon finalement je suis arrivé à avoir le bon résultat (et sans passer par un fichier) :

<?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 :

$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.

Modifié par Imp
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...