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

Bibliothèques et frameworks PHP Discussion :

[cURL] Limitation Multi requete


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut [cURL] Limitation Multi requete
    Bien le bonjour en cette belle journée.

    Je suis confronté à une question que les méandres de Google n'ont pu solutionner, j'en appelle donc à quelqu'un d'entre vous.

    Voici mon problème, mon application php (script en ligne de commande), doit balancer environ 44000 requêtes lors de son exécution. Le problème étant que ces opérations sont très gourmandes en ressources, à tel point que le reste de traitement du script est négligeable.

    Je me suis donc mis en tête d'optimiser cette opération et le multithreading (je suis en PHP 5.2) m'est apparu comme une évidence.
    Et au détour d'un article, je suis tombé sur quelque chose d'encore mieux, le curl multi:
    http://fr.php.net/manual/fr/function...multi-exec.php

    C'est magique, ca marche du feu de dieu, j'ai réduit mon temps de processing par 30. Mon chef de projet était sur un nuage jusqu'au problème soulevé.

    Curl marche tellement bien, que l'API sur laquelle je fais mes 44000 requetes gueule un peu

    Avant donc de me lancer sur un multi threading artisanal, j'aimerai savoir si on pouvait agir sur le nombre de requêtes simultanées envoyé par curl_multi via les options de CURL.

    A priori, je n'ai rien trouvé, mais je n'ai pas la science infuse, est-ce que qqn aurait été confronté au même problème ou aurait une idée pour brider curl_multi?

    En vous remerciant

  2. #2
    Membre confirmé
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Par défaut
    Intéressant.
    Je pense que ce qui est disponible est listé dans http://fr.php.net/manual/fr/function.curl-setopt.php

    Essaye de diminuer CURLOPT_MAXCONNECTS pour voir ?

    Sinon un petit CURLOPT_WRITEFUNCTION (aucune idée de ce que c'est vraiment ni comment ça s'utilise) pourrait peut-être rallonger le temps d'envoi des données (tu es sous Unix ? Tu peux faire un usleep()).

    J'espère que ça fera avancer le shmiliblick.

  3. #3
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut
    Hello,

    Yep sous unix : )

    Je fais des test déjà sur MAXCONNECTIONS mais il s'utilise en fait sur un handle et donc je me demande comment l'utiliser:

    l'idée du usleep est pas bête, je vais voir ca.

    Pour info voici le code de la fonction:
    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
     
    function reqMultiCurls($urls) {
     
    	// for storing cUrl handlers
    	$chs = array();
    	// for storing the reponses strings
    	$contents = array();
     
    	// loop through an array of URLs to initiate
    	// one cUrl handler for each URL (request)
    	foreach ($urls as $url) {
    		$ch = curl_init($url);
    		// tell cUrl option to return the response
    		curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
    		$chs[] = $ch;
    	}
     
    	// initiate a multi handler
    	$mh = curl_multi_init();
     
    	// add all the single handler to a multi handler
    	foreach($chs as $key => $ch){
    		curl_multi_add_handle($mh,$ch);
    	}
     
    	// execute the multi cUrl handler
    	do {
    		  $mrc = curl_multi_exec($mh, $active);
    	} while ($mrc == CURLM_CALL_MULTI_PERFORM  || $active);
     
    	// retrieve the reponse from each single handler
    	foreach($chs as $key => $ch){
    		if(curl_errno($ch) == CURLE_OK){
    				$contents[] = curl_multi_getcontent($ch);
    		}
    		else{
    			echo "Err>>> ".curl_error($ch)."\n";
    		}
    	}
     
    	curl_multi_close($mh);
    	return $contents;
    }

  4. #4
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut
    Bon bon rien de concluant sur les pistes soulevées.

    Je pense m'orienter vers une utilisation de fork mais j'imagine qu'il va me falloir utiliser une sémaphore (ouccccccch que c'est loin xD) car en fait, le principe est de récupérer les urls contenues dans un tableau.

    Donc je vais bouquiner ça mais si qqn a un exemple à me fournir je suis preneur bien sûr ^^

    Pour récapitulier:
    - un tableau avec X entrée d'urls
    - Je dois récupérer le contenu de ces urls (XML) en un minimum de temps mais de manière contrôlée (genre 4 / 5 thread à la fois qui dépile le tableau au fur et à mesure rempilant un autre tableau avec le résultat.

    Merci : )

  5. #5
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut
    Bon bon, je me galère un peu. Je l'ai tout de même fait en perl histoire d'avoir une solution de secours mais j'aimerais bien pour ma culture personnelle y arriver en PHP.

    Le problème, c'est comment limité le nombre de thread qui tourne, et surtout en relancer un dès qu'un se termine pour toujours en avoir le max qui tourne.

    Si qqn passant par là a une idée ^^

  6. #6
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut
    Bon finalement j'arrive à un truc pas trop mal:
    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
     
    #!/home/y/bin/php -q
    <?php
    $start = microtime(true) ;
    include('class/class.curl.php') ;
    $i = 0;
    $pid_arr = array();
    $max = count($tab) ;
    $max_thread = 2 ;
    $result = array() ;
    $n = 0 ;
    while ($n < $max) {
            if ($i<$max_thread) {
                    $pid = pcntl_fork();
                    if ($pid == -1) die('could not fork');
                    else {
                            if ($pid) $pid_arr[$i] = $pid;
                            else {
                                    echo 'Child '.$i.'('.$n.') started'."\n";
                                    $curl = new cURL(FALSE);
                                    $res = $curl->get($tab[$n]);
                                    echo $tab[$n]."\n" ;
                                    $result[$n] = $res ;
                                    exit($i) ;
                            }
                    }
                    $i++ ;
            }
     
            if ($i>= $max_thread) {
                    $pid = array_shift($pid_arr) ;
                    if (!empty($pid)) {
                            echo $pid."\n" ;
                            pcntl_waitpid($pid, $status);
                            $status = pcntl_wexitstatus($status);
                            echo "Child $status ($n) completed\n";
                            $i-- ;
                    }
            }
            $n++ ;
    }
    print_r($result) ;
    $end = microtime(true) ;
    echo "\n".'Duree:'.($end-$start)."s\n" ;
    ?>
    A noter que je n'ai pas mis mon tableau d'url ($tab), c'est voulou hein ^^

    Le gros problème c'est que j'arrive pas à récupérer le résultat de mes requêtes, certainement j'imagine pcq c'est à cet endroit que la notion de mémoire partagé entre en compte.
    Le problème est que mon php n'est pas compilé avec les fonctions de sémaphores -_-

    Dooooonc, si jamais qqn a une idée je le tente quand même

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Limiter les requete
    Par flash22 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 09/02/2011, 10h18
  2. [Doctrine] Limit dans requete avec Doctrine
    Par Shandler dans le forum ORM
    Réponses: 21
    Dernier message: 03/11/2010, 17h20
  3. Limiter résultat requete sql par critère
    Par filoulebauju dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/09/2009, 14h11
  4. [10g] SQL Multi-Requete
    Par GSXRider dans le forum Oracle
    Réponses: 9
    Dernier message: 08/10/2007, 09h45
  5. VB6 - RECORDSET multi requete
    Par laurent1 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/07/2006, 19h10

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