Consigli per ottimizzare PHP

ispirato da una guida originale di Reinhold Weber

le basi...

  1. Uno script PHP è almeno 2-10 volte più lento di una pagina HTML.
  2. echo è più veloce di print.
  3. Usa i multi-parametri di echo anzichè concatenare le stringhe, es. echo('Ciao ', $nome);
  4. Fai uso delle innumerevoli funzioni predefinite di PHP! Spesso non è necessario che tu scriva la tua!
  5. Chiudi le connessioni al database quando non servono più.
  6. Imposta il maxvalue dei cicli for prima del ciclo stesso e non al suo interno.
  7. Mai usare funzioni per il maxvalue, ad esempio for ($x=0; $x < count($array); $x) la funzione count() viene eseguita ad ogni loop!
  8. Fai l'unset delle variabili per liberare memoria, specialmente se sono grandi array.
  9. $row['id'] è 7 volte più veloce di $row[id].
  10. Racchiudere le stringhe tra apostrofi (es 'ciao') anziché apici (es "ciao") risulta leggermente più veloce dal momento che PHP cerca le variabili all'interno di "..." e non all'interno di '...'. Ovviamente puoi fare così solo quando non hai bisogno di variabili all'interno delle stringhe.


più a fondo...

  1. require_once() è costosa.
  2. Sopprimere gli errori con @ è molto lento.
  3. Usa la funzione switch anziché molti if ed else if.
  4. Se un metodo può essere static, dichiaralo static. E' 4 volte più veloce.
  5. Usando percorsi assoluti negli include e require, viene speso meno tempo per risolvere i percorsi completi del SO. (Ma attenzione, imposta il percorso assoluto in una costante, altrimenti dovrai riscrivere tutto in caso di cambio di path assoluto sul server).
  6. Per conoscere l'istante in cui lo script è stato eseguito, $_SERVER['REQUEST_TIME'] è meglio di time().
  7. Controlla se puoi utilizzare strncasecmp, strpbrk e stripos al posto di regex.
  8. str_replace è più veloce di preg_replace, ma strtr è più veloce di str_replace di 4 volte!
  9. Se una funzione, per esempio di string replacement, accetta sia stringhe che array come argomenti, e se la tua lista di argomenti non è particolarmente lunga, considera di scrivere codice un po' più ridondante che utilizzi più volte la funzione passando le stringhe, anziché una singola linea di codice che utilizzi array come argomenti del search & replace.
  10. Incrementare una variabile locale in un metodo è più veloce. Così come richiamare una variabile locale in una funzione.
  11. Incrementare una variabile globale è 2 volte più lento rispetto ad una variabile locale.
  12. Incrementare le proprietà di un oggetto (es. $this->prop++) è 3 volte più lento rispetto ad una variabile locale.
  13. Incrementare una variabile locale non definita è 9-10 volte più lento rispetto ad una inizializzata.
  14. Anche dichiarare una variabile globale senza utilizzarla in una funzione rallenta le cose (tanto quanto incrementare una variabile locale). PHP probabilmente fa un controllo per verificare se esiste tale variabile globale.


per chi fa colazione con pane e oop...

  1. Non sempre l'OOP in PHP è la scelta migliore: l'overhead è significativo. Ciascun metodo e chiamata ad un oggetto consumano memoria.
  2. ...richiamare una funzione vuota passando un solo parametro richiede lo stesso tempo di 7-8 $localvar++. Analogamente, la chiamata di un metodo altrettanto semplice impiega l'equivalente di 15 $localvar++. Sei proprio certo di voler utilizzare obj->setValue($var)?
  3. Non implementare qualsiasi struttura dati come una classe, gli array sono un'alternativa più veloce.
  4. Non suddividere troppo i metodi: pensa quale parte di codice dovrai realmente riutilizzare...
  5. ...puoi sempre dividere il codice di un metodo più tardi, quando e se sarà necessario.
  6. I Metodi nelle classi derivate vengono eseguiti più velocemente di quelli definiti nella classe base.
  7. Il tempo di invocazione di un metodo sembra non risentire del numero totale di metodi definiti nella classe.
  8. Evita i magici __get, __set, __autoload.
  9. /* php_geek_mode=max */
    Lavorando con le stringhe, se devi controllare che siano di una certa lunghezza probabilmente utilizzi la funzione strlen().
    Questa funzione è abbastanza rapida dato che non fa alcuna operazione di calcolo ma semplicemente restituisce la lunghezza, già conosciuta, della stringa presente nella struttura zval (la struttura C interna usata per salvare le variabili in PHP). Tuttavia, poiché strlen() è una funzione rimane alquanto lenta a causa della chiamata stessa che richiede numerose operazioni come il lowercase & hashtable lookup seguito dall'esecuzione della funzione. In alcuni casi puoi migliorare la velocità del codice usando questo trucco con isset():

    if (strlen($foo) < 5) { echo 'Foo is too short'; } // Corretto
    vs.
    if (!isset($foo{5})) { echo 'Foo is too short'; } // Più veloce

    Richiamare isset() risulta più veloce poiché è un costruttore del linguaggio e non una funzione quindi la sua esecuzione non richiede il lookup e lowercase delle funzioni. Non c'è quindi overhead si quello che è il vero codice che determina la lunghezza della stringa.
    /* php_geek_mode=default */
  10. In PHP, $i++ è leggermente più lento di ++$i (idem in caso di decremento).
    Il post-incremento ($i++) causa la creazione di una variabile temporanea che viene poi incrementata laddove invece il pre-incremento opera direttamente sulla variabile. Questa è una delle tipiche ottimizzazioni effettuate dagli opcode optimizer come Zend, eAccelerator, APC etc.
  11. Se hai funzioni particolarmente cpu-intensive, considera la possibilità di scriverle come estensioni C.
  12. Profila il tuo codice. Un profiler evidenzia il tempo impiegato dalle varie porzioni del codice. Il debugger Xdebug contiene già un profiler con il quale individuare i colli di bottiglia e migliorare le performance globali della tua applicazione web. Puoi chiederne l'attivazione al supporto.


[Lato server:~] #...

  1. Utilizza il mod_deflate per Apache 2.x per risparmiare banda. Hosting Professionale utilizza da sempre la compressione lato server. Quindi, disattiva la compressione gzip da PHP, per evitare una doppia ricompressione!
  2. Gli script PHP sono ricompilati ogni volta che vengono eseguiti. Utilizza un software di caching PHP per incrementare le performance del 25-100%. Hosting Professionale utilizza da sempre eAccelerator.
  3. Usa memcached, un sistema di caching degli oggetti in memoria concepito per alleggerire il carico sul database.
  4. Utilizza con cautela il mod_PageSpeed: un eccellente modulo sviluppato da Google per Apache ed nginx che racchiude numerose ottimizzazioni server-side.


Torna su