Domanda

Sto eseguendo il porting di un'applicazione Web di grandi dimensioni in un ambiente di hosting Web condiviso.L'app è stata scritta in PHP 4.Il nuovo ambiente ha PHP 5.2.

Per qualche ragione, l'applicazione perde enormi quantità di memoria quando viene eseguita in PHP 5.2.Posso letteralmente osservare l'utilizzo della memoria salire alle stelle utilizzando memory_get_usage(), fino a raggiungere il limite di 64 MB (che è molto generoso in un ambiente condiviso, il sito veniva eseguito con 12 o 16 MB su PHP 4).

Sospetto che questo sia un effetto collaterale di qualcosa che è cambiato in PHP 5, molto probabilmente la gestione dei riferimenti agli oggetti negli argomenti.Tuttavia, la ricerca del/i comportamento/i particolare/i che causa/no la fuga di notizie è estremamente difficile in quanto l'applicazione è molto complessa e in parte non molto ben scritta (sì, è mia).

Dato che l'app è installata su uno spazio web condiviso, non posso utilizzare le classiche funzionalità di debug (per quanto ne so).Mi piacerebbe davvero molto evitare di ricreare l'ambiente localmente, dato che sto lavorando al progetto letteralmente tutto il giorno da un po' di tempo.

Quindi le mie domande sono:

  • Qualcuno conosce le tipiche trappole della transizione PHP4 => 5, specialmente quando si ha a che fare con grandi quantità di oggetti, che potrebbero essere la causa delle mie perdite?

  • Qualcuno conosce una sorta di strumento di "dump dell'ambito grafico" indipendente dal debugger e solo da script per le variabili utilizzate da PHP che potrebbe aiutarmi a scoprire quali variabili stanno consumando queste enormi quantità di memoria?

È stato utile?

Soluzione

Per risolvere questo problema vorrei:

  1. Profilare lo script con xdebug+wincachegrind (o qualche altro profiler) e/o firephp.
  2. Attiva la modalità STRICT per ricevere tutti gli errori + avvisi php.

Facendo ciò, sarai in grado di:

  • Ottimizza il tuo codice.(La rimozione di errori/avvisi/avvisi può velocizzare il codice)
  • Pulisci il tuo codice.(Utilizzare la sintassi corretta dell'oggetto php5 può solo essere positivo per le prestazioni).

Il modello a oggetti è cambiato completamente da PHP4 a PHP5.Di sicuro, la modalità STRICT ti dirà che non dovresti usare un esplicito "passato per riferimento".

Altri suggerimenti

Un problema comune che ho riscontrato in una versione della 5.2 era che strtotime perdeva senza che memory_get_usage lo rilevasse.Il passaggio a strptime ha risolto il problema.

C'è una segnalazione di bug per questo per 5.2.8 - http://bugs.php.net/bug.php?id=46889.

Senza debugger puoi aprire uno script che ritieni utilizzi molta memoria e inserire la funzione memory_get_usage nelle posizioni critiche.

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