Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Aide] Fsockopen

5 réponses
Avatar
JC
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.

5 réponses

Avatar
Olivier Miakinen

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

Auriez vous un exemple [...]


Non, désolé (avec Curl non plus, du reste). Je laisse la parole aux
éventuels gourous.

Avatar
JC
À 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>.

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.


Avatar
thierry
Bonjour,

je viens d'essayer de comprendre le fonctionnement de la fonction
fsockopen, mais j'ai encore du mal.
Ok


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: Closernrn";
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

Avatar
JC
[...]
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.


Dans ton cas, le
$send .= "Connection: Closernrn";
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.

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


Merci, je vais regarder ce lien.

en espérant avoir aidé

thierry


Avatar
fred
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/