Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Multi curl

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398

    Multi curl

    Ho capito come funziona e qui c'e' un esempio

    Pero non e' esattamente quello che voglio fare.
    Tutti gli esempi che ho trovato in rete fanno partire delle richieste parallelamente controllano
    che il curl abbia finito e leggono i risultati.

    A me serve una cosa leggermente diversa se ho da fare 100 richieste 10 alla volta vorrei poter
    gestire la prima che finisce cosi da poter accodarne subito un altra...

    Si e' capito ?
    Idee ?


    Andrea

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Nell'attesa che qualcuno mi illumini ho generato questo codice ...
    Sembra andare ma non ne sono per niente convinto spero che qualcuno abbia la pazienza di
    analizzare la cosa anche perche' sta roba e' documentata pochissimo.

    Sto arrancando ...
    Due note la mia intenzione e' quella di fare piu richieste parallele su diversi server ma al massimo una per server.


    Codice PHP:
    <?php

    $urls 
    = array (array("http://www.google.it/",
                
    "http://www.google.it/search?hl=it&q=pippo&btnG=Cerca&meta=",
                
    "http://www.google.it/search?hl=it&q=pluto&btnG=Cerca&meta="),
            array(
    "http://www.altavista.com/",
                
    "http://www.altavista.com/web/results?itag=ody&q=prova&kgs=1&kls=0",
                
    "http://www.altavista.com/web/results?itag=ody&q=pluto&kgs=1&kls=0"),
            array(
    "http://www.yahoo.com/",
                
    "http://it.search.yahoo.com/search?p=prova&fr=yfp-t-501&ei=UTF-8&rd=r1",
                
    "http://it.search.yahoo.com/search?p=pluto&fr=yfp-t-501&ei=UTF-8&rd=r1"));
    $numServer count ($urls);

    $pointServer = array();
    $result = array();

    $mh curl_multi_init();


    foreach (
    $urls as $i => $url) {
           
    $conn[$i]=curl_init($url[0]);
           
    $pointServer[$i] = 0;

           
    curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
           
    curl_setopt($conn[$i],CURLOPT_FOLLOWLOCATION,1);
           
    curl_setopt($conn[$i],CURLOPT_MAXREDIRS,2);
           
    curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);

           
    curl_multi_add_handle ($mh,$conn[$i]);
    }

    $active TRUE;

    while (
    $active) {
        while ((
    $mrc curl_multi_exec($mh$active)) == CURLM_CALL_MULTI_PERFORM);

        foreach (
    $conn as $i => $con) {

            if (
    is_null($conn[$i])) {continue;}

            if (
    curl_getinfo($con,CURLINFO_HTTP_CODE) != 0) {
                
    $result[] = !curl_error($con) ? curl_multi_getcontent($con) : null;
                
    curl_multi_remove_handle($mh,$con);
                
                if (
    $pointServer[$i] < count($urls[$i])) {
                    
    $pointServer[$i] ++;
                    
    $conn[$i]=curl_init($url[$pointServer[$i]]);
                    
    curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
                        
    curl_setopt($conn[$i],CURLOPT_FOLLOWLOCATION,1);
                        
    curl_setopt($conn[$i],CURLOPT_MAXREDIRS,2);
                        
    curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);

                        
    curl_multi_add_handle ($mh,$conn[$i]);
                } else {
                    
    $conn[$i] = null;
                }
            }
            
        }

    }

    foreach (
    $conn as $i => $con) {
        if (
    is_null($conn[$i])) {continue;}
        
    $result[] = !curl_error($con) ? curl_multi_getcontent($con) : null;
        
    curl_multi_remove_handle($mh,$con);
    }
    curl_multi_close($mh);
    print_r($result);


    ?>
    Andrea

    p.s. non e' scritto un gran che bene ma e' un test :P

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    uppo

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    dai nessuno che abbia lavorato con cose simili ?

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398

  6. #6
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    non ho capito bene qual'è il tuo quesito, il punto è che curl funziona come qualsiasi altro comando php, non devi essere tu a gestire la coda, semplicemente se metti 2 istruzioni una conseguente all'altra in php, la seconda non viene eseguita finchè non è stata eseguita la prima.

    Questo vale sia per le istruzioni più banali sia per quelle legate all'attesa di una risposta dall'esterno (ad esempio il curl o le chiamate system).

    Per dirlo in termini tecnici, il thread è uno solo, non è che partono 10 thread che lavorano parallelamente le tue richieste.

    Se non ho capito bene fammi sapere

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Non e' cosi.
    Il multi curl se gestito bene lancia delle richieste asincrone e parallele.

    La mia domanda e' se quello che ho scritto fa esattametne quello che penso che faccia
    perche' non e' facile da testare.
    Fermo restando che sono sicuro del fatto che manda richieste parallele.

    Il problema e' che tutti i codici che ho trovato hanno una coda di query e un numero massimo di richieste parallele.

    Quello che devo fare io e' avere 10 code parallele con una sola richiesta contemporanea per coda.
    Per intenderci ogni coda e' un server distinto e la frequenza di di richieste per server non puo essere troppo alta.
    Ma nulla mi vieta di interrogare tutti i server parallelamente.

    E vuoi perche' il multi curl e' documentato da schifo vuoi perche' la mia esigenza e' molto particolare non trovo nulla in rete che possa aiutarmi.


    Andrea

  8. #8
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    sorry, non avevo visto che usavi multi_curl, e devo essere sincero non la conoscevo...


  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    resuscito questo post per l'ultima volta nella speranza che qualcuno tornato dalle ferie
    risponda

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.