Discussion:
[Aide] Fsockopen
(trop ancien pour répondre)
JC
2007-07-27 13:28:18 UTC
Permalink
Bonjour,

je viens d'essayer de comprendre le fonctionnement de la fonction
fsockopen, mais j'ai encore du mal.
J'ai recherché des exemples, mais les commentaires sont pas tjs là, ou
alors ce sont des usines à gaz; :-(
Je cherche à faire une fonction qui se connecte à une page pour la
récupérer.

Auriez vous un exemple pour récupérer dans une variable cette page par
exemple :
www.mondomaine.com/dossier/mapage.html
Et en donnant comme parametres :
Accept-Language: fr-fr
User-Agent: Mozilla/5.0


Le seul script que j'ai trouvé et qui s'en rapproche le plus est celui-ci :

if ( ( $io = fsockopen( "www.yahoo.com", 80, $errno, $errstr, 5 ) ) !==
false )
{
$send = "GET / HTTP/1.1\r\n";
$send .= "Host: www.yahoo.com\r\n";
$send .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.2.1) Gecko/20021204\r\n";
$send .= "Referer: www.yahoo.com\r\n";
$send .= "Accept: text/xml,application/xml,application/xhtml+xml,";
$send .= "text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,";
$send .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
$send .= "Accept-Language: fr-fr, en-us, en;q=0.50\r\n";
$send .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n";
$send .= "Connection: Close\r\n\r\n";

fputs ( $io, $send );
$send = '';

do
{
$send .= fgets ( $io, 4096 );
} while ( strpos ( $send, "\r\n\r\n" ) === false );

$info = decode_header ( $send );
$send = '';

while ( ! feof ( $io ) )
{
$send .= fread ( $io, 8192 );
}

fclose ( $io );
$send = decode_body ( $info, $send );
echo '<h3>Header Array</h3>';
echo '<pre>';
print_r ( $info );
echo '</pre>';
echo '<h3>Document Body</h3>';
echo $send;

}

les fonctions decode_header et decode_body ne sont pas recopiées, elles
servent à mettre en forme les resultats.
Merci de votre aide.

JC.
Olivier Miakinen
2007-07-27 15:00:26 UTC
Permalink
Post by JC
je viens d'essayer de comprendre le fonctionnement de la fonction
fsockopen, mais j'ai encore du mal.
J'ai recherché des exemples, mais les commentaires sont pas tjs là, ou
alors ce sont des usines à gaz; :-(
Je cherche à faire une fonction qui se connecte à une page pour la
récupérer.
À moins que tu ne tiennes à fsockopen juste pour le « challenge »
d'utiliser des fonctions de bas niveau, sache que ce sera peut-être plus
simple avec Curl : <http://fr2.php.net/curl>.
Post by JC
Auriez vous un exemple [...]
Non, désolé (avec Curl non plus, du reste). Je laisse la parole aux
éventuels gourous.
JC
2007-07-27 15:34:59 UTC
Permalink
Post by Olivier Miakinen
À moins que tu ne tiennes à fsockopen juste pour le « challenge »
d'utiliser des fonctions de bas niveau, sache que ce sera peut-être plus
simple avec Curl : <http://fr2.php.net/curl>.
Post by JC
Auriez vous un exemple [...]
Non, désolé (avec Curl non plus, du reste). Je laisse la parole aux
éventuels gourous.
merci de la reponse.
je connaissais aps cette fonction, et elle est disponible chez mon
hebergeur. parfait !
J'etais parti sur le fonction fsockopen car j'avais besoin d'envoyer des
headers, mais cela est possible aussi avec cette fonction.
merci.

JC.
thierry
2007-07-27 15:34:59 UTC
Permalink
Bonjour,
Post by JC
je viens d'essayer de comprendre le fonctionnement de la fonction
fsockopen, mais j'ai encore du mal.
Ok
Post by JC
Je cherche à faire une fonction qui se connecte à une page pour la
récupérer.
Ce n'est pas tout à fait la même chose.
fsockopen est une fonction que je qualifierais de "bas niveau" dont
l'utilisation peut procurer quelques plaisirs mais aussi de bon maux de
tête.

Dans l'exemple que tu cites, ce que tu sembles surtout vouloir faire
c'est te connecter en HTTP à un serveur pour récupérer des données.
Dans ce cas il est bien plus pratique d'utiliser CURL
http://fr3.php.net/manual/fr/ref.curl.php
si elle est disponible.
Cette librairie est d'un niveau au dessus des sockets en ce sens qu'elle
s'appuie sur les sockets pour mettre en oeuvre divers protocoles dont HTTP.

En l'utilisant tu résoudras ton problème de récupération de page, mais
ta compréhension de fsockopen ne progressera pas.

La seule fois, pour l'instant, ou j'ai eu besoin de fsockopen, c'est
pour valider une transaction paypal, $fp étant un socket valide:
fputs ($fp, $header . $body);
$res = '';
while (!feof($fp)) {
$res .= fgets ($fp, 1024);
}
est pertinent dans mon contexte pour récupérer la réponse du serveur de
validation paypal.

Dans ton cas, le
$send .= "Connection: Close\r\n\r\n";
me semble louche. Je ne suis pas un expert en HTTP mais tu sembles
indiquer au serveur que tu ne veux pas attendre sa réponse ?? A vérifier
donc dans une doc HTTP.

Pour forger des requêtes HTTP, fiddler est un outils bien pratique aussi.
http://www.fiddlertool.com/fiddler/

en espérant avoir aidé

thierry
JC
2007-07-27 17:09:57 UTC
Permalink
[...]
Post by thierry
Dans l'exemple que tu cites, ce que tu sembles surtout vouloir faire
c'est te connecter en HTTP à un serveur pour récupérer des données.
Dans ce cas il est bien plus pratique d'utiliser CURL
http://fr3.php.net/manual/fr/ref.curl.php
si elle est disponible.
Cette librairie est d'un niveau au dessus des sockets en ce sens qu'elle
s'appuie sur les sockets pour mettre en oeuvre divers protocoles dont HTTP.
Merci pour cette réponse. Efectivement, je vais me pencher la dessus.
J'ai deja trouvé quelques exemples de cette fonction.
Post by thierry
Dans ton cas, le
$send .= "Connection: Close\r\n\r\n";
me semble louche. Je ne suis pas un expert en HTTP mais tu sembles
indiquer au serveur que tu ne veux pas attendre sa réponse ?? A vérifier
donc dans une doc HTTP.
Apparement c'est bien comme cela qu'elle s'emploi. Dans mes differents
tests, j'obtenais bien la page, mais suivant les serveurs, j'obtenais
des resultats differents.
Post by thierry
Pour forger des requêtes HTTP, fiddler est un outils bien pratique aussi.
http://www.fiddlertool.com/fiddler/
Merci, je vais regarder ce lien.
Post by thierry
en espérant avoir aidé
thierry
fred
2007-08-01 06:02:14 UTC
Permalink
Bonjour JC,

Pour lire les requetes passées par le navigateur, a ré-écrire via CURL,
rien de mieux que Firefox et un pluging nommé LiveHTTPHeaders.
dispo à http://livehttpheaders.mozdev.org/

Continuer la lecture sur narkive:
Loading...