PHP: ottimizzare le nostre applicazioni – parte 3
Eccoci all’ultima parte dell’articolo sull’ottimizzazione del codice PHP. Per chi avesse perso gli altri due, i link sono i seguenti:
Sommario:
- PHP: ottimizzare le nostre applicazioni – (Consigli base, Variabili, Strutture di controllo e cicli)
- PHP: ottimizzare le nostre applicazioni – parte 2 - (Stringhe, Array)
- PHP: ottimizzare le nostre applicazioni – parte 3
Oggi mi occuperò principalmente della programmazione OOP ma prima di chiudere tratterò anche le connessioni MySQL e piccoli accorgimenti di programmazione.
Object-Oriented Programming
- non esiste solo l’OOP
L’OOP è sicuramente il paradigma più importante dei linguaggi di programmazione ma non per questo bisogna sempre e solo ragionare ad oggetti. Conosco programmatori molto bravi, davvero molto bravi, ma che hanno un brutto difetto: vedono tutto ad oggetti. Se il nostro script deve fare la somma di due parametri in ingresso non c’è alcun bisogno di scrivere una classe in PHP che realizzi tale somma! Bastano due righe di codice.
L’OOP è molto lenta di per sè; richiede spazio e tempo di istanziazione, metodi per accedere ai parametri, overhead, ecc. Non dico di evitarla come la peste ci mancherebbe, anche perchè sarei un’ipocrita visto l’uso che ne faccio, dico però che bisogna usarlo solo quando effettivamente serve.
Basti pensare che modificare il valore di una proprietà di un oggetto richiede un tempo triplo rispetto alla modifica del valore di una variabile semplice.
$this -> count++; //richiede 3 volte il tempo di $count++;
- se usi PHP 5 preferisci i metodi __construct() e __destruct()
Con l’arrivo della versione 5 il supporto all’OOP è migliorato davvero di molto e sono stati introdotti nuovi costrutti, metodi e funzionalità che avvicinano le potenzialità del PHP a quelle dei più noti linguaggi ad oggetti. Una miglioria tra queste è sicuramente l’introduzione dei costrutti di cui sopra che servono ad instanziare e distruggere un’istanza della classe. Finora li abbiamo sempre definiti noi, anche con nomi a nostra scelta e questa possibilità è ancora consentita ma iniziare a programmare utilizzando gli strumenti che il PHP già ci offre è sempre buona norma e soprattutto è guadagno in termini di prestazioni. Ovviamente se lavoriamo in PHP 4 è inutile seguire questo consiglio ma se usiamo la versione 5 è fortemente consigliato.
Vediamo come si usano i due costrutti:
class Example {
var integer;
var string;
var array;
function __construct( $int, $string, $array ) {
$this->integer = $int;
$this->string = $string;
$this->array = $array;
}
function __destruct() {
unset( $this->array );
}
}
//istanza della classe
$example = new Example( 123, "Lorem", $array );
- scegli attentamente la visibilità delle proprietà e dei metodi
Come ben sappiamo metodi e proprietà di una classe, come la classe stessa possono avere tre tipi di visibilità: public, protected e private. Non sto qui ad insegnare il significato e le caratteristiche di ognuno però il consiglio che dò è scegliere con molta attenzione a quale delle tre deve appartenere. Non è tanto questione di prestazioni quanto di metodi per accedere alle suddette proprietà; una scelta errata in fase di progettazione porta poi ad un sacco di perdita di tempo nell’utilizzo della classe.
- favorisci metodi statici quando possibile
Un metodo dichiarato statico risulta essere 4 volte più veloce. Dichiarare un metodo (o una proprietà) static significa creare un metodo (o una proprietà) che esiste indipendentemente dall’istanziazione della classe stessa. Un velocissimo esempio di utilizzo:
class Example2 {
public static function static_method() {
echo "Hello World";
}
}
//senza instanziazione
Example2::static_method();
//con instanziazione
$example = new Example2();
$example->static_method();
- non generalizzare al massimo una classe
La dinamicità di una classe e dei suoi metodi è sicuramente utile però poco prestazionale. Vero che creare una classe che può adattarsi a più esigenze ci fa risparmiare tempo in fase di realizzazione ma le prestazioni ne risentono tantissimo. Creiamo le classi per ciò che effettivamente dovranno fare, senza spezzettare o modularizzare i metodi più di quanto effettivamente se ne ha bisogno. Bisogna in effetti stare attenti alle chiamate ai metodi, cosa che vedremo nel prossimo punto.
- fai attenzione ai metodi set()
settare una variabile attraverso la chiamata di un metodo risulta essere 7 volte più lento di un semplice $i++. Non sto dicendo di non usare classi però valutiamo bene se ne abbiamo effettivamente bisogno.
Quando ho deciso di scrivere questo articolo avevo pensato di chiudere qui; in corso d’opera ho pensato però che sono altri gli errori che vengono compiuti quindi ho deciso di aggiungere la seguente parte, sperando di aver fatto cosa gradita.
Connessione ad un database mysql
- chiudi la connessione al database quando non serve più
E’ un consiglio prestazionale ma soprattutto per la sicurezza. Quando ci connettiamo ad un db creiamo un link che ci portiamo dietro, una volta terminato il suo utilizzo invece è buona norma chiudere la connessione in maniera da rilasciare il link ed evitare spiacevoli sorprese.
- favorisci query con JOIN
Dovrei più spesso seguire anche io questo consiglio. In fatto di prestazioni utilizzare il JOIN velocizza moltissimo l’esecuzione di una query. Questo consiglio non sarebbe da attribuire al PHP in quanto riguarda le prestazioni del MySQL ma una query veloce riduce l’attesa del PHP nella ricezione dei dati. Il JOIN è un costrutto molto potente, il suo utilizzo riduce tantissimo sia il tempo di esecuzione che le righe di codice per realizzare una query. Consiglio davvero fortemente di imparare bene il costrutto.
- gestisci al meglio gli errori
Se una query non va a buon fine, il MySQL può restituirci l’errore. Caratteristica utilissima quando davvero non sappiamo proprio dov’è che stiamo sbagliando. Il metodo si chiama mysql_error() e salva su una variabile la stringa di errore restituita dal db.
- mysqli vs mysql
Molti ignorano proprio l’esistenza dell’estensione mysqli nel PHP e la stragrande maggioranza delle persone non la usano. Tale estensione invece è molto più potente e prestante della classica estensione mysql. Un semplicissimo esempio di connessione utilizzando le due estensioni:
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'db');
//mysql
$mysql = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db(DB_DATABASE);
...
mysql_close($mysql);
//mysqli
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
...
mysqli_close($link);
Varie
- require() vs require_once()
La differenza tra le due funzioni riguarda una semplice caratteristica; caratteristica che però risulta essere fondamentale. La require_once() include anche essa un file all’interno del progetto stando però attento ad includerlo una sola volta. Vale a dire che se, per errore o volutamente, è stato già inserito lo stesso file nello stesso progetto, non dà errori. Tale funzione però è molto lenta rispetto alla semplice require (che è già lenta di per sè), quindi valutiamo quando effettivamente ne necessitiamo.
- path assoluti vs path relativi
Il PHP impiega molto meno tempo a risolvere un path assoluto piuttosto che ricostruire il file system di un path relativo. Se possibile quindi preferiamo il path assoluto di un file, ovviamente salvandolo in una variabile per non doverlo riscrivere ogni volta.
- quando possibile utilizza una cache
Gli script PHP vengono ricompilati ad ogni loro chiamata. E’ consigliato, quando possibile, utilizzare software di caching per ridurre le prestazioni tra il 25% e il 100%.
- evitare l’operatore @
L’operatore in questione è molto utile; se anteposto ad una chiamata a funzione (o semplice operazione), non fa fallire lo script in caso di errore. Tale scelta, seppur utile è però molto lenta. E’ più indicato capire quali sono gli errori che possono verificarsi ad una chiamata di una funzione e cercare di prevenirli.
- profila il codice in fase di developing
I profiler presenti per PHP sono molti, tra tutti Xdebug. Utilizzarli durante la fase di developing ci fa risparmiare davvero molto tempo. E’ come utilizzare Firebug durante la realizzazione di un template web.
Chiudo qui l’articolo, se avete altri consigli che ho omesso o, perchè no, non conosco, lasciate liberamente un commento. Sarò ben felice di apprenderli
Riferimenti:
Articolo letto 908 volte.
Post correlati:
- PHP: Guida pratica all’estensione mysqli – parte 2
- PHP: Guida pratica all’estensione mysqli – parte 1
- MySQL: Estrarre dei record casuali da una tabella
- PHP: ottimizzare le nostre applicazioni – parte 2
- PHP: ottimizzare le nostre applicazioni
- 10 metodi per effettuare automaticamente o manualmente il backup di un db MySql
- Ereditarietà CSS
- PHP automatic file and database backup script
- Visualizzare le ultime news di un blog sul vostro sito
- Strumenti per la gestione di un database MySQL
























Back to top








Cellulare: (+39) 340-8652066
Mail:
WLM:
[...] PHP: ottimizzare le nostre applicazioni – parte 3 [...]
[...] This post was mentioned on Twitter by Simone D'Amico and Simone D'Amico. Simone D'Amico said: PHP: ottimizzare le nostre applicazioni – parte 3 | PHP: optimize our applications | New post at: http://bit.ly/8lQeB [...]