Domanda

Ho scaricato un database che è stato esportato nel formato TXT e ha circa 700 MB con 7 milioni di record (1 per riga).Ho creato uno script per importare i dati in un database mysql, ma quando vengono inseriti circa 4 milioni di record, il browser si blocca.Ho provato in Firefox e IE.Qualcuno può darmi un parere e qualche consiglio a riguardo?

La sceneggiatura è questa:

<?php
set_time_limit(0);
ini_set('memory_limit','128M');

$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }

while(!feof($ponteiro)){
    $conta++;

    $linha = fgets($ponteiro,4096);
    $linha = str_replace("\"", "", $linha);
    $arr = explode(";",$linha);
    $sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
    $rs = mysql_query($sql);
    if(!$rs){ echo $conta ." error";}

    if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
    myflush();
}

echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
È stato utile?

Soluzione

provare a dividere il file in 100 blocchi MB. Questo è un suggerimento solving rapido per ottenere il lavoro fatto. Il problema del browser può diventare complicato da risolvere. Prova anche diversi browser.

phpMyAdmin ha opzioni per continuare la query se un incidente è accaduto. Permette di interruzione di importazione nel caso in cui lo script rileva è vicino al limite di tempo. Questo potrebbe essere un buon modo per importare file di grandi dimensioni, ma può rompere le transazioni.

Altri suggerimenti

Non sono sicuro che il motivo per cui è necessario un browser web per inserire i record in MySQL. Perché non utilizzare le strutture di importazione del database stesso e lasciare il web fuori di esso?

Se questo non è possibile, mi piacerebbe chiedo se la suddivisione in blocchi gli inserti in gruppi di 1000 in un momento aiuterebbe. Invece di commettere l'intero database come una singola transazione, mi consiglia di rompere in su.

Si sta utilizzando InnoDB?

  1. Quello che ho notato prima è che si sta utilizzando flush () non sicuro. Facendo flush () quando il buffer è pieno httpd risultato in un errore e lo script muore. Rinunciare a tutto questo myflush () soluzione e utilizzare un singolo ob_implicit_flush() invece.

  2. Non è necessario essere vederlo con il browser per farlo funzionare fino alla fine, è possibile inserire una ignore_user_abort() modo che il codice deve completare il suo lavoro, anche se il browser muore.

  3. Non capisco perché il browser sta morendo. Forse lo script sta generando troppi contenuti.

Da provare senza


Pausa: nnnn

output al browser, e vedere se questo aiuta. Può essere semplicemente che il browser sta soffocando sulla pagina web tempo è chiesto di rendere.

Inoltre, è PHP timeout durante il lungo trasferimento?

Non aiuta, anche, di avere il sonno (10) aggiungendo il tempo necessario.

Si può provare a dividere il file in diversi file TXT, e rifare il processo utilizzando i file. So che ho usato almeno una volta questo approccio.

Il browser sta soffocando perché la richiesta sta impiegando troppo tempo per essere completato. C'è una ragione questo processo dovrebbe essere parte di una pagina web? Se dovete assolutamente fare in questo modo, pensare di dividere il backup dei dati in parti gestibili.

Esegui il codice nella riga di comando utilizzando PHP-CLI.In questo modo, non incontrerai mai timeout per processi di lunga durata.Tuttavia, la situazione è che il tuo browser si blocca prima del timeout ^^.Se provi a eseguire l'esecuzione in un server hosting a cui non hai accesso alla shell, esegui il codice utilizzando crontab.Ma devi assicurarti che crontab eseguire solo una volta!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top