PDA

View Full Version : [PHP+MYSQL] Importazione dati da file excel


jeremy.83
23-04-2013, 08:59
Buongiorno a tutti.

Premetto che la mia è più una domanda di tipo "sistemista" che di programmazione in sè.

Presso un cliente abbiamo realizzato un gestionale in php. Il cliente ha richiesto l'importazione di vari file excel (sono dei listini dei fornitori) per poter utilizzare i dati del listino all'interno del gestionale stesso.

Questi fogli excel possono essere anche molto grossi, di diversi MB di dimensione per un totale a volte di più di 20000 righe.

Abbiamo usato InnoDB come engine Mysql, in modo da poter realizzare le transazioni e controllare il flusso delle operazioni.

In realtà l'applicazione è già esistente e funzionante, per farlo abbiamo utilizzato la classe esterna PHPExcel e tutto è stato eseguito correttamente. Lo script può durare anche tra i 10 e i 15 minuti di esecuzione.

Il grosso problema è stato che dopo l'importazione il processo mysqld è impazzito e mi è andato in out of memory.

Vorrei evitare che succeda ciò, in quel caso per risolvere ho riavviato il server, ma vorrei trovare un soluzione da php senza riavviare il server.

Preciso che l'intera operazione è stata inserita in un'unica transazione e penso che sia quello il problema, cioè troppi dati salvati dal processo che mi è di fatto esploso. Preciso infine che all'interno del ciclo vengono eseguite almeno 2 query per volte (quindi ad esempio su 20000 righe vengono eseguite almeno 40000 query)

Una soluzione quale potrebbe essere? Ho cercato in rete ma ho trovato poche risposte. Tendenzialmente non mi va di esportare il file in csv e reimportarlo...

JuliLogan
24-04-2013, 10:28
hai verificato la memoria assegnata al php nel php.ini?

jeremy.83
24-04-2013, 14:01
Ciao, grazie per la risposta.

Su un file di config che viene importato ci abbiamo piazzato un

ini_set("memory_limit","512M");

Ho paura ad aumentare quel valore. L'applicativo php gira su una VM a cui è stata assegnata 1 GB di RAM. Dopo questo episodio ho portato la RAM a 2 GB, ma non sono sicuro che sia sufficiente