IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] file_get_contents + preg_match = pas rapide


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut [POO] file_get_contents + preg_match = pas rapide
    Bonjour

    Je voudrais une poser une question relative à php ( en général ) et plus particulièrement sur deux commandes, celles citées dans l'objet.

    Sur wamp en local je me suis mis a griffonner un bout de code qui a pour but, très grossièrement, de ramener le code source d'une page dans une variable ( file_get_contents ) et d'appliquer un preg_match(all) sur la page.

    Après je suis en mesure de savoir si j'ai d'autres pages à aspirer ( code source ) ce que mon programme fait sans broncher.

    Le but final est bien entendu de pouvoir récupérer des infos sur les sites ( à la volée ) pour peut etre ( j'en suis pas là encore je débute ) me construire des flux rss ou atom ou autres afin de ne plus avoir besoin de glaner de l'info sur le web à coup de clic clic.

    Mais le problème numéro 1 c'est la vitesse d'execution : quand il faut aspirer une cinquantaine de page ( très courant pour le contexte ) qu'est ce c'est long !! Très très long !
    Ca plante pas ( ouf ) mais j'en ai facilement pour plusieurs minutes d'execution !
    Mes terrains de reflexion sont : changer de php à perl (?) ou un langage comme delphi ( que je connais aussi bien que php ( le strict minimum pour m'en sortir ) ? Ajax pour ne récupérer que les flux pile poile et le code source intéressant.
    Redecouper le php en fonctions et autres techniques de dévelloppeurs confirmé ( mais ca resoudra pas la lenteur des file_get_contents quand il y en a 50 pages et + )
    Quoiqu'il en soit le programme ne fonctionnera qu'en local sur mon PC sur XP.

    Mon problème numéro 2 c'est le file_get_contents et la gestion d'erreur ; quand ca plante pour une page je suis marron ; j'ai essayé d'utiliser un package de PEAR ( je me rappelle plus du nom ) qui sur leur site semble être pile poile ce qu'il me faut. Après plusieurs essais je n'arrive toujours pas à me servir du patch. Aurriez vous un exemple concret de A a Z pour m'aider à l'implementer correctement ?

    Enfin pour terminer j'ai quand même envie de balancer un vieux brouillon ( = version 0.1 a améliorer optimiser réécrire ??? ) ; il s'agit d'un script a base de boucles conditions et file_get_contents + preg_match ; Plus précisemment pour celui ci un code qui va me chercher les infos des produits d'un rayon d'un magasin ( désolé pour la pub dans le code source vraiment )

    Je suis en ce moment en train d'essayer de mettre une version 0.2 de ce programme donné en exemple ci-bas qui couplé a mysql pour la gestion des rayons ( avec des champs et des séparateurs en guise de sérialisation ) me permettrai quelque soit le magasin et quel que soit le rayon de me donner les infos des produits.

    Mais tous mes programmes sont de la meme veine, alors toute proposition d'amélioration est la bienvenue. Je ne pourrais que m'améliorer ( d'un point de vue php ).

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    je ne crois pas que le probleme vienne de php, mais plutot des contraintes liées au réseau.

    Si tu veux récuperer les informations de 20 sites internets, il faut interroger les 20 serveurs en question, et donc additionner le temps de génération de chaque page de chaque serveur... donc forcement ca augmente vite.

    Deux choses posent problemes en plus :

    * Du point de vue ethique, as tu demandé la permission d'extraires des données aux sites "sources" ? Ce genre de comportement n'est pas tres bien vu en général...
    * Du point de vue technique, ton script reste dépendant de l'architecture des sites sources. Si un site modifie son code html, ton preg echouera et tu devra retoucher ton site...

    Il me semble donc mieux de contacter chaque site "source" afin d'obtenir leur consentement pour la récupération des données, et, eventuellement, s'ils sont gentils, et s'ils ont le temps, l'idéal serait qu'ils te fournissent une page en xml facile a parser avec juste les infos qui t'interessent.

    Cela ne résoud pas completement le probleme technique du temps d'execution, meme si ca devrait deja le réduire un peu.
    Pour cela, je verrais bien une sorte de cache avec rafraichissement tournant :
    A la 1ere execution de la page, tu va rechercher les infos du site n°1
    A la 2eme execution de la page, tu va rechercher les infos du site n°2, etc...

    Ainsi, si tu as 20 sites "sources", tes informations ne seront a jour qu'au bout de 20 rechargement de page... mais d'un autre coté, je pense pas que les sites en questions evoluent toutes les 3 minutes non plus... peut etre 3 fois par jour max non ?

    Apres tu peux optimiser le rechargement avec qqchose comme ca :
    Charger X sites a chaque execution de page, X étant un chiffre connu fixé arbitrairement, ou encore adaptable au temps d'execution restant. L'idée étant d'afficher ta page (avec les données en cache, donc pas a jour), puis une fois la page chargée, apres la balise </html>, tu rajoute un morceau de script qui va recharger les pages de ton cache *tant que tu as encore du temps dans la limite des 30 secondes*. Tu peux utiliser fsockopen plutot que file_get_contents afin de spécifier un timeout de connection, afin d'etre sur que tu ne dépasse pas le temps restant. Cela suppose evidemment de mesurer entre autre le temps d'execution de la page depuis le début, afin de calculer le temps qu'il te reste réellement !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Hello,

    Je pense que les sites autorisant ce genre de manoeuvre propose justement des flux RSS, Atom... Ces technologies sont là pour ça.

    Tu devrais plutôt t'orienté vers un lecteur RSS PHP.

    Concernant ton application en elle-même, je suis du même avis que Fladnag, il s'agit d'une communication client-server, avec les contraintes de temps que ça implique et les fonctions utilisées...

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2003
    Messages : 217
    Points : 242
    Points
    242
    Par défaut
    Sinon, tu peux utiliser un cron ou un webcron et stocker les informations.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut Ok pour les contraintes client serveur
    Je voudrais juste revenir sur quelques points si possible.

    Tout d'abord tout ce que j'envisage et mets en place comme scripts php sur mon wamp est pour un usage strictement perso. J'insiste je n'ai pas de site internet.

    Il y a plusieurs contextes sur internet qui me poussent ( comme bien d'autres internautes je pense ) a prendre de l'info. En ce qui me concerne les principaux qui me viennent a l'esprit sont : achat sur internet , surveillance de mes blogs préférés , actualités officielle et "officieuse", tris de flux RSS trouvés a droite a gauche.

    ACHAT SUR INTERNET

    Quel magasin propose tous ses produits du catalogue en un flux RSS bien fait et exhaustif ? est ce vraiment là son intérêt ( nous faire gagner du temps ) ou son interet se situe plutot a nous noyer dans ses rayons pour nous faire acheter ?

    D'ailleurs a ce propos , reunir plusieurs sources de plusieurs sites dans un script et trier les produits afin d'eliminer les doublons et les produits non en vente ne me parait completement déplacé.

    Par exemple pour une clé usb mp3 de marque X et de modèle Y , le script détecte sa présence dans 86 rayons de 56 magasins et me fait un résumé a l'ecran de toutes les descriptions produits - de toutes les images relatives au produit - de tous les commantaires clients ... Benh au moins AVEC DE L'INFORMATION je sais a quoi m'en tenir ... J'achete ou j'achete pas.

    Les comparateurs de prix ne me conviennent pas , ne donnent pas beaucoup d'infos et tous ce qui les interessent et de me vendre la camelote.

    SURVEILLANCE DE MES BLOG PREFERES

    Sur ce point aucun problème il y a moins de rubriques a surveiller que les magasins. Il proposent des flux mais ne me conviennent pas car peu exhaustifs - et ne font pas tous état des commantaires laissés pour chaque article.

    TOUT CA POUR DIRE

    Que les flux RSS sont une bonne idée mais ne sont pas "convenables" pour un utilisateur comme moi qui les considèrent un peu limite surtout dans le domaine du commerce sur internet.

    Il y a rien de mieux que de prendre le contrôle de son ordinateur et coder. Si pour ca je dois continuer a aspirer le web sans consentement ( ! puisque je n'obtiendrais pas complètement ce que je veux en contactant les équipes ) pour obtenir de l'information je continuerai a le faire sans hésiter.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    bah, si c'est pour un usage strictement personnel, pourquoi pas, mais tu n'est alors pas limité par le temps d'execution par exemple, puisque si le serveur tourne chez toi, rien ne t'empeche d'utiliser set_time_limit(0);
    Apres c'est a toi de voir combien de fois tu veux des informations "fraiches".
    Pour ce qui est des achats sur le net, je pense pas que tu cherches a acheter des trucs tout les matins (enfin si c'est le cas tant mieux pour toi ;o)

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut
    bah, si c'est pour un usage strictement personnel, pourquoi pas, mais tu n'est alors pas limité par le temps d'execution par exemple, puisque si le serveur tourne chez toi, rien ne t'empeche d'utiliser set_time_limit(0);


    Pour ce qui est des achats sur le net, je pense pas que tu cherches a acheter des trucs tout les matins (enfin si c'est le cas tant mieux pour toi ;o)
    Je me disais juste que mettre en "boite" ces magasins ( par un script ) prendrait autant de temps que de consulter 1 fois ou 2 maluellement leurs rayons régulièrement.
    Et me permettrait de TRES VITE consulter BEAUCOUP d'informations produits emanant de plusieurs sources EN UNE SEULE PAGE.
    Une page qui te regrouperai par exemple 200 dexcription vendeur + 49 images + 236 commantaires clients etc DU MEME PRODUIT

    C'est pourquoi je voulais savoir si avant de me lancer dans la configuration des rayons qui m'interessent , avant de me lancer tête baissée à la recherche de magasins que je ne connais pas , il y avait une autre méthode plus adéquate qui pouvait remplacer PHP + file_get_contents + expressions régulières.

    * Du point de vue ethique, as tu demandé la permission d'extraires des données aux sites "sources" ? Ce genre de comportement n'est pas tres bien vu en général...
    Donc pour une utilisation perso je vais pas en prison on est d'accord ?

    * Du point de vue technique, ton script reste dépendant de l'architecture des sites sources. Si un site modifie son code html, ton preg echouera et tu devra retoucher ton site...
    Ca c'est bien vrai ; c'est pourquoi il faudrait pouvoir générer des alertes si le preg_match_all ne correspond plus.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par ulysse_31
    Donc pour une utilisation perso je vais pas en prison on est d'accord ?
    Je ne suis pas juriste, donc je ne peux pas t'en assurer, mais je fais pareil de mon coté (meme que parfois c'est pas completement perso mais chut, faut pas le dire ;o)

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    Pour ce qui est de l'utilisation de PHP + file_get_contents + preg ça me parait tout à fait adapté dans ton cas.
    Eventuellement tu peux remplacer preg par un traitement tidy+xml, qui peut être plus facile/fiable que preg si le site est bien construit. Au niveau temps d'execution par contre je ne pense pas qu'il y ait de différence majeure. A mon avis ton souci se situe plus au niveau du nombre de pages à récuperer, avec les temps de connexions qui en découlent.

    Pour regler ce pb, le mieux est surement que tu fasse tourner un cron qui récupere les infos qui t'interessent et les met dans une BDD. Ensuite interroger la base devrait être suffisament rapide

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut Merci
    a vous tous

    Je suis content de pas etre complètement hors sujet avec ma facon de proceder ...


    Eventuellement tu peux remplacer preg par un traitement tidy+xml, qui peut être plus facile/fiable que preg si le site est bien construit.
    Merci pour l'info mais après réflexion et avoir mis mon nez dans des codes sources de mes futures cibles ... et vu le bazar dedans ... je resterai sur la methode file_get_contents + preg.

    Peut être pour d'autres contextes...

    Je ne ferme pas tout de suite le thread au cas où quelqu'un pense a quelquechose d'autre...

    Merci à vous - Ulysse vous salue


  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Un preg_match() sur une page html standard est très rapide si, du moins, ton masque est bien construit.

    Concernant l'utilisation de file_get_contents, le conseil donné plus haut par Fladnag sur l'utilisation de fsockopen plutôt que file_get_contents est très judicieux car il n'est pas possible de mettre une temporisation (timeout) sur un flux ouvert par file_get_contents.

    Tu éviteras ainsi de bloquer tout ton script pour un site lent.

    fsockopen (tout comme les fonctions de la librairie CURL) permettent de mettre un timeout sur la connexion ET sur le flux. De plus, tous deux peuvent suivre des redirections http (très facile en CURL, moins avec les sockets).

    Enfin, avec les sockets (ou CURL) tu peux faire une gestion des réponses http et ainsi gérer les erreurs éventuelles.

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut file_get_contents VS Curl
    J'ai regardé du côté de Curl
    Si je m'attendais

    Est ce que les 2 bouts de code pourrait etre equivalent ?

    CURL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,"http://www.myurl.com/");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $result=curl_exec ($ch);
    curl_close ($ch);
    ?>
    FILE_GET_CONTENTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $url = "http://mama.html";
    $result = file_get_contents($url);
    Et en deux mots ( je regarderais la doc dès que j'aurais le temps ) est ce suffisant pour recupérer un NULL ou -1 en cas d'erreur sur $result ?

    Pour le moment je suis en train de réessayer une dernière fois PEAR ( pour un patch de file_get_contents ) ; je risque rien a apprendre 2 ou 3 trucs dessus - au pire je n'aurais perdu qu'une soirée de plus - même si maintenant je me dis que maitriser CURL serait tip top

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Pour les timeout de connexion et de flux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CURLOPT_CONNECTTIMEOUT
    CURLOPT_TIMEOUT
    Pour la gestion d'erreur de CURL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $CurlErr = curl_error($ch);
    if ($CurlErr){
      echo $CurlErr;
    }
    Par rapport à fsockopen, pour la concision du code, il n'y a pas photo. CURL est gagnant.

    fsockopen est un poil plus rapide (quelques mili-secondes)

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut
    En feuilletant de la documentation curl, j'ai noté que cette commande risquait de ne pas être valide sur tous serveur web. ( ?? )
    http://nepomiachty.developpez.com/ex...ees/index4.php

    Il est dit je cite
    Cependant, pour les personnes qui ne peuvent pas installer cette commande sur leur serveur, nous verrons une solution alternative, en établissant un dialogue en sockets avec les fonctions réseau de Php. C'est une méthode moins élégante, la gestion du dialogue HTTP se fait "à la main".
    Je me poses la question pour freeperso

    C'est pourquoi j'ai essayé fsockopen en intégrant un timer pour faire une comparaison fsockopen VS file_get_contents

    J'ai donc récupéré une classe timer et une fonction get_html ( fsockopen )

    CODE COMPLET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    <?php
     
    // Timer de génération de page
    class timer {
     
        var $startTime = NULL;
        var $stopTime  = NULL;
     
        function start() {
            $this->startTime = microtime();
        }
     
        function stop() {
            $this->stopTime = microtime();
        }
     
        function getTime() {
            list($uSecondeA, $SecondeA) = explode(' ',$this->startTime);
            list($uSecondeB, $SecondeB) = explode(' ',$this->stopTime);
            $total = ($SecondeA - $SecondeB) + ($uSecondeA - $uSecondeB);
            return number_format(abs($total),2);
        }
    } 
     
    function get_html($url)
    {
      if (strtoupper(substr($url,0,7))=="HTTP://") $url=substr($url,7);
      $p = strpos($url,"/");
      if ($p===FALSE)
      {
        $nom_domaine=$url;
        $get="/";
      }
      else
      {
        $nom_domaine=substr($url,0,$p);
        $get=substr($url,$p);
      }
      $errno="";
      $errstr="";
      $r="";
      $fp = fsockopen($nom_domaine, 80, &$errno, &$errstr, 15);
      if($fp)
      {
        socket_set_timeout($fp, 45);
        fputs($fp,"GET $get HTTP/1.1\r\n");
        fputs($fp,"Host: $nom_domaine\r\n");
        fputs($fp,"Connection: Close\r\n\r\n");
        $r="";
        while(!feof($fp))
        {
          $r.=fgets($fp,1024);
        }
        fclose($fp);
        return($r);
      }
      return('');
    }
     
    // GET_HTML ( fsocketopen )
    $timer_get_html = new timer;
    $timer_get_html -> start();
    $html = get_html('http://www.01net.com/index.tlc');
    $timer_get_html -> stop();
    echo '<pre>';var_dump($timer_get_html);echo '</pre>';
    // echo '<pre>';var_dump($html);echo '</pre>';
     
    // FILE_GET_CONTENTS
    $timer_fgc = new timer;
    $timer_fgc -> start();
    $html = file_get_contents('http://www.01net.com/index.tlc');
    $timer_fgc -> stop();
    echo '<pre>';var_dump($timer_fgc );echo '</pre>';
    // echo '<pre>';var_dump($html);echo '</pre>';
    ?>
    Quand à vous dire qui est le vainqueur je sais toujours pas ! ( convertir le tableau de sortie timer en une phrase simple du style ' il m'a fallut ';N;' secondes';

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    object(timer)#1 (2) {
      ["startTime"]=>
      string(21) "0.48557900 1165379068"
      ["stopTime"]=>
      string(21) "0.27320800 1165379071"
    }
     
    object(timer)#2 (2) {
      ["startTime"]=>
      string(21) "0.35294100 1165379071"
      ["stopTime"]=>
      string(21) "0.97925000 1165379074"
    }
    M'enfin ce n'est sûrement qu'un détail .

    Vive la programmation ! !

  15. #15
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    Citation Envoyé par ulysse_31
    Vive la programmation ! !
    et oui, quand tu récupères une classe il faut essayer de prendre la doc avec pour savoir comment l'utiliser

    d'après le code source de la classe "timer", je pense qu'il faut ça à la place de ton "var_dump" pour afficher la durée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     echo $timer_fgc->getTime();

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par ulysse_31
    En feuilletant de la documentation curl, j'ai noté que cette commande risquait de ne pas être valide sur tous serveur web. ( ?? )
    Chez tous les hébérgeurs que j'ai essayés, CURL est disponible. Un simple phpinfo() devrait t'en informer.

    Je ne pousse pas à la charrette pour CURL mais je trouve cette librairie très complète. Un autre exemple de son avantage sur fsockopen: pour obtenir des statistiques sur le flux d'un socket PHP, tu as la fonction stream_get_meta_data($fp). Voici ce qu'elle retourne sur un flux fsockopen avec un timout sur la connexion et le flux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Array
    (
        [stream_type] => socket
        [unread_bytes] => 0
        [timed_out] => 
        [blocked] => 1
        [eof] => 1
    )
    Maintenant CURL avec curl_getinfo ($ch):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Array
    (
        [url] => http://www.rfc-editor.org/rfc/rfc2606.txt
        [content_type] => text/plain
        [http_code] => 200
        [header_size] => 233
        [request_size] => 114
        [filetime] => -1
        [ssl_verify_result] => 0
        [redirect_count] => 0
        [total_time] => 0.669859
        [namelookup_time] => 0.16426
        [connect_time] => 0.336042
        [pretransfer_time] => 0.336194
        [size_upload] => 0
        [size_download] => 8008
        [speed_download] => 11954
        [speed_upload] => 0
        [download_content_length] => 8008
        [upload_content_length] => 0
        [starttransfer_time] => 0.502547
        [redirect_time] => 0
    )
    Ici encore, il n'y a pas photo. De plus, si tu apprends le binding PHP de libcurl, tu n'auras aucune difficulté à l'utiliser en script shell sur un serveur Linux. La syntaxe est différente mais la logique et les fonctionnalités restent les mêmes. A toi de voir.

  17. #17
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut Curl +1
    d'après le code source de la classe "timer", je pense qu'il faut ça à la place de ton "var_dump" pour afficher la durée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $timer_fgc->getTime();
    A 5h du matin je partais me coucher Il était grand temps.
    Donc pour le vainqueur FILE_GET_CONTENTS VS FSOCKETOPEN

    => pas de solution pour moi, un coup l'un un coup l'autre ( mais jamais plus d'une seconde d'ecart )

    Je ne pousse pas à la charrette pour CURL mais je trouve cette librairie très complète
    Je trouve vraiment sympa que vous insistiez autant

    Je viens d'essayer de le mettre en oeuvre en m'aidant de ceci :
    http://nepomiachty.developpez.com/ex...ees/index4.php

    Avec un copier-coller et si j'oublie rien on obtient ce petit bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    function get_html($url, $parametres=array())
    {
      $params='';
      if ($parametres['Referer']!="") $params.='-e '.$parametres['Referer'];
      if ($parametres['Proxy']!="") $params.='-x '.$parametres['Proxy'];
      if ($parametres['BrowserName']!="") $params.='-A "'.$parametres['BrowserName'].'"';
      return (`curl $params $url`);
    }
     
    $html = get_html('http://google.fr','');
    echo var_dump($html);
     
    ?>
    La fonction me renvoie tout naturellement NULL

  18. #18
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut
    J'ai toujours pas trouvé comment manipuler Curl
    Je suis en panne ...

    La bonne nouvelle c'est que j'ai réussi à trouver un petit script PEAR ( file_get_contents ) qui me récupère le contenu html et une erreur.

    Je retenterais Curl cette nuit pour l'instant c'est un bon rôti qui m'attend
    J'en profiterais pour essayer PEAR de nouveau.

    Si vous souhaitez m'aider

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par ulysse_31
    return (`curl $params $url`);
    Là, tu exécutes le CURL de Linux.

    Si le binding PHP de CURL n'est pas installé, il y a encore moins de chances pour qu'exec() system() et autres passthru() le soient!

    Penche-toi sur la doc PHP de CURL. Principalement la page sur curl_setop()
    http://be2.php.net/manual/fr/function.curl-setopt.php

    Essaye les exemples et regarde les quelques pistes que je t'ai données plus haut sur les options utiles.

    CURL-PHP fait souvent peur, mais à tort. Assez facile à aborder. Faut l'essayer c'est tout.

  20. #20
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut Youpiiiiiiii
    CURL +1

    Ca yest un petit bout de code pour stoker le contenu html d'une URL dans une variable.
    Curl me renvoie même bool:false si erreur. Même le temps !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    // Création d'une ressource CURL
    $ch = curl_init();
     
    // Définition de l'URL et autres options appropriées
    curl_setopt($ch, CURLOPT_URL, "http://www.google.fr");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, false);
     
    // Récupération de l'URL et passage au navigateur
    $html = curl_exec($ch);
    $b = curl_getinfo($ch);
    // Fermeture de la ressource CURL et libération des ressources systèmes
    curl_close($ch);
     
    echo '<pre>';var_dump($html);echo '</pre>';
     
     
    echo '<pre>';echo $b[total_time];echo ' secondes</pre>';
     
    ?>
    Merci à tous pour vos contributions ca me va droit au coeur.
    Merci encore à vous 6.

    Et si par hasard il existe encore d'autres méthodes pour stocker le contenu HTML d'une URL + gestion d'erreur - je suis toute ouïe ;
    Tant qu'on y est

    Les 4 methodes sont file_get_contents_normal , file_get_contents_pear , fsocketopen , curl.

    Sinon , le sujet est résolu.


    Vive CURL !!!


Discussions similaires

  1. [RegEx] mise a jour ereg > preg_match pas moyen de trouver comment faire
    Par atc666 dans le forum Langage
    Réponses: 4
    Dernier message: 31/05/2015, 00h03
  2. [POO] franchir le pas
    Par taffMan dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2007, 13h33
  3. [POO]Classe ou pas classe
    Par loverdose dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2007, 17h49
  4. [POO] ne fonctionne pas
    Par pongping dans le forum Langage
    Réponses: 3
    Dernier message: 13/04/2007, 12h45
  5. glInterleavedArrays : Rapide ou pas ?
    Par Argh! dans le forum OpenGL
    Réponses: 2
    Dernier message: 03/12/2003, 05h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo