Domanda

Abbiamo un grande software di gestione che sta producendo grandi report di ogni tipo, basato su numerosi loop, con recuperi di database, creazioni di oggetti (molti) e così via.

Su PHP4 potrebbe funzionare felicemente con un limite di memoria di 64 MB - ora lo abbiamo spostato su un nuovo server e con lo stesso database - stesso codice, gli stessi report non verranno visualizzati senza un limite di memoria. ..

So che PHP5 è cambiato un sacco di cose, ma c'è un modo per farlo comportare?

La domanda alla fine è: quali strategie applichi quando devi avere i tuoi script su una dieta?

È stato utile?

Soluzione

Un grosso problema che abbiamo riscontrato sono i riferimenti circolari tra gli oggetti che impediscono loro di liberare memoria quando diventano fuori campo.

A seconda della tua architettura potresti essere in grado di usare __destruct () e disinserire manualmente qualsiasi riferimento. Per il nostro problema ho finito per ristrutturare le classi e rimuovere i riferimenti circolari.

Altri suggerimenti

Quando devo ottimizzare le risorse su qualsiasi script, provo sempre ad analizzare, profilare ed eseguire il debug del mio codice, utilizzo xDebug e xDebug Profiler , ci sono altre opzioni come APD e Benchmark Profiler .

Inoltre ti consiglio questo articolo:

Da quando ti sei trasferito sul nuovo server, hai verificato che le tue variabili di sistema MySQL e PHP sono identiche a come erano sul tuo vecchio server?

PHP5 ha introdotto molte nuove funzionalità, ma a causa del suo mantra di compatibilità con le versioni precedenti, non credo che le differenze tra PHP5 e PHP4 dovrebbero causare un impatto così grande sulle prestazioni di un'applicazione il cui codice e database non sono stati alterata.

Hai anche la stessa versione di Apache o IIS?

Sembra un problema che è più probabilmente correlato al nuovo ambiente di sistema che a un aggiornamento da PHP4 a 5.

Bertrand,

Se sei interessato al refactoring del codice esistente, ti consiglio di monitorare prima l'utilizzo della CPU e della memoria durante l'esecuzione dei rapporti. Stai bloccando il tuo server SQL o stai bloccando Apache (cosa che succede se un sacco di stress viene messo sul sistema dal codice PHP)?

Ho lavorato su un progetto che inizialmente impantanava MySQL in modo così grave che abbiamo dovuto riformattare l'intero processo di generazione dei report. Tuttavia, quando abbiamo finito il caricamento è stato semplicemente trasferito su Apache (tramite il codice PHP più complesso). La nostra soluzione finale era quella di riformattare la progettazione del database per fornire prestazioni migliori per le funzioni di reportistica e usare PHP per colmare il rallentamento di ciò che non potevamo fare nativamente in MySQL.

A seconda della natura dei report, è possibile prendere in considerazione la possibilità di denormalizzare i dati utilizzati per i report. Si potrebbe anche considerare la costruzione di un secondo database che funge da data warehouse ed è progettato attorno ai principi OLAP anziché ai principi OLTP. Puoi iniziare da Wikipedia per una spiegazione generale di OLAP e data warehousing.

Tuttavia, prima di iniziare a considerare il refactoring serio, hai verificato che i tuoi ambienti siano sufficientemente simili guardando phpinfo (); per PHP e SHOW VARIABLES; in MySQL?

Un concerto!?!

anche 64 MB è grande.

ignorando la discrepanza tra gli ambienti, (che suona molto strano), sembra che il codice potrebbe aver bisogno di un nuovo factoring.

ogni possibilità che tu possa rifattorizzare il tuo codice in modo tale che i set di risultati delle query del database non vengano scaricati in array. Ti consiglierei di costruire un iteratore per i tuoi set di risultati. (quindi puoi trattarli come array per la maggior parte degli scopi). Esiste una grande differenza tra la gestione di un record alla volta e la gestione di 10.000 record alla volta.

in secondo luogo, dai un'occhiata al meteo che il tuo codice sta creando più istanze dei dati. Puoi passare gli oggetti per riferimento. (usa "& amp;"). Dovevamo fare una cosa simile quando usavamo una prima variante della struttura dell'orda. un allegato da 1 MB esploderà a 50 MB da numerose chiamate che hanno passato l'intero set di dati come copia, piuttosto che come riferimento.

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