Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35

    Multi Curl, Memory leak and Timeout ignored

    Ciao Belli!

    Ho 2 problemi:
    Il primo è che quando esequo grosse multi curl la memoria finisca, ho già risolto aumentandola con ini_set("memory_limit","64M");
    Però non mi piace come soluzione! Non c'è un modo per elaborare il risultato del curl appena questo viene caricato e poter poi rimuovere subito dopo l'handle?

    Secondo problema(quello importante): Ci mette troppo tempo! (tipo 40+ secondi)
    Sono una ventina di link e se li fa tutti insieme non capisco perchè ci mette tanto!

    I limiti di tempo sono settati! Timeout= 6 e ConnectTimeout=3
    Quindi non vorrebbe dire che nella peggiore delle ipotesi impiega 9 secondi a completare (o a fallire) la pagina?

    Codice PHP:
            $mh curl_multi_init();
            for(
    $j=0$j<$i$j++){
                
    $ch[$j] = curl_init($SubLinks[$j]['Link']);
                
    curl_setopt($ch[$j], CURLOPT_CONNECTTIMEOUT3);
                
    curl_setopt($ch[$j], CURLOPT_TIMEOUT6);
                
    curl_setopt($ch[$j], CURLOPT_RETURNTRANSFERtrue);
                
    curl_setopt($ch[$j], CURLOPT_MAXREDIRS0);
                
    curl_multi_add_handle($mh$ch[$j]);
            }
            
            
    $active null;
            do {
                
    $mrc curl_multi_exec($mh$active);
            } while (
    $mrc == CURLM_CALL_MULTI_PERFORM);

            while (
    $active && $mrc == CURLM_OK) {
                if (
    curl_multi_select($mh) != -1) {
                    do {
                        
    $mrc curl_multi_exec($mh$active);
                    } while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
                }
            }
            
    Dichiara_sites();
            
            for(
    $j=0$j<$i$j++){
                if(
    $ch[$j]){ // echo "
     
    $j $i";
                    
    $Dati[$j] = EstraiDati(curl_multi_getcontent($ch[$j]));
                    curl_multi_remove_handle(
    $mh$ch[$j]);
                    curl_close(
    $ch[$j]);
                }
            } 

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    Nessuno sà aiutarmi? : (

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    ti consiglio di fare dei dump in vari punti del codice per vedere esattamente i tempi di esecuzione e capire dov'è che c'è più "delay", poi posta qui i risultati (indicativamente: prima di ogni ciclo, all'inizio ed alla fine dentro ogni ciclo, prima di ogni chiamata a un esecuzione cUrl)

  4. #4
    ma che vuol dire che ci mette troppo tempo scusa? il tuo browser per aprire la pagina di html.it ci metterà 5 secondi, e tu vuoi metterci meno di 40 secondi per aprire 20 pagine? cmq vedi se ci mette molto tempo per inviare la richiesta o per processare i risultati..per abbassare il limite di memoria dovresti lupare sui 20 link e per ogni link invii la richiesta curl, la processi e poi cancelli l'handler...
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    cmq prova come dicevo, tipo:

    Codice PHP:
    $ts time(); // INIT TIMER ----------------------------------------------------------------------
    $mh curl_multi_init();
    $td time(); $te $td-$ts$ts $td; print "1: $te
    "
    // CHECK TIMER ---------
            
    for($j=0$j<$i$j++){
    $td time(); $te $td-$ts$ts $td; print "2.$j$te
    "
    // CHECK TIMER ------
                
    $ch[$j] = curl_init($SubLinks[$j]['Link']); 
    ...e così via, poi posti il risultato (si vedranno i vari "punti" del codice con i vari "ritardi")

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    I 40secondi circa ovvimante erano calcolati dall'inizio alla fine dello script con microtime. I caricamenti del browser non centrano niente

    Avevo già testato i vari tempi, e vi posto un nuovo test:

    Numero Link: 159
    Aggiunto gli handle +4.4
    Eseguito multicurl +29696.9
    Estratti i dati +2275.6

    Quindi in questo test l'esecuzione del multi curl mi ha preso 30secondi
    Il punto è che dovrebbe metterci massimo 3secondi per la connessione + 6 secondi per il caricamento, poi dovrebbe andare in timeout e darmi subito i risultati!

    Cosa sbaglio? Troppi link e non li fa tutti insieme ma li raggruppa in più gruppi?
    Purtroppo non trovo una guida dettagliata di come funzioni il multicurl in questi casi.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    fai dei test cambiando il numero delle chiamate (variabile $i nel tuo caso, mi pare), usando 1, 2, ..., limitemax per vedere come cambia...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.