Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    indicazioni all'utente su operazioni molto lunghe

    ciao

    all'interno di una applicazione in PHP do la possibilità di inseirire dei prodotti in un db leggendoli da un file cvs, questi prodotti sono molti (circa 12000)

    se il prodotto non già presente nel db lo inserisco, altrimenti lo aggiorno
    questo comporta però che per ogni prodotto che verifico faccio una query di controllo, il tutto si tramuta in un'operazione molto lunga, con mysql al 100%, vorrei sapere come poter dare un'informazione all'utente sullo stato di avanzamento

    (vedersi la pagina bianca per 2 minuti non è il max)

    come posso fare? se stampo a video degli avanzamenti percentuali questi vengono stampati solo a fine elaborazione...


    avevo pensato una cosa di questo tipo:

    apro in un popup un'altra finestra che si ricarica ogni 5 secondi e che mostra lo stato di una variabile di sessione che viene aggiornata dall'altra pagina....altrimenti come faccio? grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    Non credo sia possibile segnalare la percentuale di avanzamento con il codice PHP, in quanto, come hai detto tu, viene mostrata solo a fine caricamento.

    L'idea della pop-up è l'unica che mi viene in mente, anche se io, invece della pop-up che può risultare fastidiosa, dividerei la pagina in due frame, in una inserisco l'avanzamento, nell'altra la pagina vera e propria.


  3. #3
    Ciao,

    12000 prodotti non dovrebbero essere molti se li carichi con il metodo giusto, immagino tu legga la stringa, la spezzetti e poi faccia diversi INSERT.

    Se possibile invece dovresti usare un'unica query con
    LOAD DATA INFILE

    http://dev.mysql.com/doc/refman/4.1/en/load-data.html

    caricare tutto in un'apposita tabella e poi effettuare gli inserimenti/aggiornamenti attraverso query SQL, distribuendo i dati tra le varie tabelle.

    questo è il sistema più efficiente

    Se comunque ci dovesse essere un tempo di attesa piuttosto lungo e la finestra del browser bianca diventasse noiosa, puoi sempre mettere l'operazione in background.

    Tra un po' aggiornerò il thread per spiegare come
    per favore NIENTE PVT TECNICI da sconosciuti

  4. #4
    ciao questo è il mio codice:

    Codice PHP:
        $records file($file);

        

        
    $rec_aggiornati    =0;

        
    $rec_inseriti        =0;



        for(
    $i=0;$i<sizeof($records);$i++){

                
    //ora divido il record in tante stringhe a seconda del ;

            
    $campo=explode(";",$records[$i]);

            

            
    //recupero i vari campi che sono 20
            
    $campo1=$campo[0];
            
    /*
            ....
            */



            
    if(mysql_num_rows(mysql_query("select codice from $this->tabella where codice='$campo1'"))>0){
            
    //aggiorno
            
    $rec_aggiornati++;
            
    $_SESSION["$rec_aggiornati"]=$rec_aggiornati;

            
    $query="update $this->tabella set .....campi where codice='$campo[0]'";
            
    //echo $query;


            
    mysql_query($query) or die (mysql_error());

        }else{
            
    $rec_inseriti    ++;
            
    $_SESSION["$rec_inseriti"]=$rec_inseriti;

            
    //inserisco

            
    $query="insert into $this->tabella ...campi..";

            
    //echo $query;


            
    mysql_query($query) or die (mysql_error());
        }


        }

        

        echo 
    "RECORD INSERITI: $rec_inseriti";

        echo 
    "

    "
    ;

        echo 
    "RECORD AGGIORNATI: $rec_aggiornati"

    se lo eseguo su un file che contiene 12000 prodotti si blocca...non ho aspettato oltre 3 minuti...

    se invece tolgo il controllo e gli faccio fare solo le insert in 5 secondi carica tutto!
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  5. #5
    Con l'altro sistema allora ci metteresti meno di 5 secondi.

    Invece 3 minuti sono tantissimi.

    Inoltre MySQL non dovrebbe andare al 100%

    Il metodo più performante è caricare tutto in una tabella "temporanea" con LOAD DATA (meglio una tabella normale usata come se fosse temporanea)

    E poi attraverso delle join con le tabelle da aggiornare

    effettuare

    1) delete delle righe non più presenti nella tabella "temporanea"

    2) insert delle righe nuove (insert ...select)

    3) update...join con i dati prelevati dalla tabella temporanea


    oppure se la logica dell'applicazione che usa il db te lo permette

    1) TRUNCATE di tutto
    2) Distribuisci nuovamente i dati tra le tabelle con INSERT (insert...select)
    per favore NIENTE PVT TECNICI da sconosciuti

  6. #6
    uff non ci siamo...

    ho provato a fare come dici mettendo i dati in una tabella temporanea e poi inserire solo alcuni prodotti:

    codice:
    $query="insert into $this->tabella (select * from $this->tabella_tmp where codice not in (select codice from $this->tabella))";
    ma già questa query blocca tutto x più di 2 minuti...e manca ancora quella di update!
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  7. #7
    20 minuti con il processo mysqld al 80%...
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  8. #8
    Stai facendo delle subquery non necessarie, insert...select non richiede subquery.

    il not in non è necessario, basta una left join

    verifica anche la presenza di indici corretti

    Il sistema che ti ho descritto lo usiamo in diverse applicazioni su file di dati molto grandi e non ci mette più di 5 o 6 secondi compresa l'importazione FTP da remoto
    per favore NIENTE PVT TECNICI da sconosciuti

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.