10 “comandamenti” per sviluppare in PHP

Quando si affronta un progetto di sviluppo di un’applicazione web in PHP, ci sono alcuni punti fondamentali da seguire per consentire una crescita organica e una manutenzione efficiente del software. Vediamo i 10 principali.

di Enrico Zimuel

1) Scelta del framework di sviluppo

Una delle prime domande da porsi è quale framework di sviluppo utilizzare. Pensare di costruire un’applicazione professionale in PHP senza l’utilizzo di un framework di sviluppo è uno dei primi errori che si può commettere. Un framework di sviluppo, se scelto opportunamente, garantisce delle solide fondamenta su cui far crescere la propria applicazione.

Nell’ecosistema PHP esistono decine di framework open source tra i quali scegliere: Laravel, Symfony, Zend Framework sono soltanto alcuni esempi. Questi progetti sono utilizzati da anni da milioni di sviluppatori in tutto il mondo. Inoltre, i codici sorgenti sono rilasciati con licenze di tipo open source, utilizzabili anche per scopi commerciali.

La scelta del framework di sviluppo deve essere legata alle esigenze di business, all’eventuale assistenza (anche a pagamento) offerta dai vari progetti e alle caratteristiche architettuali: Model View Controller (MVC), Middleware…

2) Versionamento dei sorgenti

La gestione delle versioni dei codici sorgenti è un aspetto fondamentale in ogni progetto di sviluppo software. Condividere il codice tra più sviluppatori con la possibilità di lavorare contemporaneamente su porzioni di codice che potrebbero intersecarsi è un aspetto importante da tenere presente. Come gestire eventuali conflitti? Come essere sicuri che tutti i membri del team lavorino sulla stessa versione aggiornata? Come effettuare un’operazione di rollback, ossia riportare il codice alla versione precedente?

Questi aspetti possono essere gestiti utilizzando uno strumento di versionamento del codice. Uno dei sistemi più utilizzati è Git. Esistono diverse soluzioni SaaS in circolazione, tra le più famose github.com e bitbucket.org. L’utilizzo di queste soluzioni online consente di agevolare la gestione dei codici sorgenti anche tra team distribuiti in regioni geografiche differenti.

3) Dipendenze con librerie esterne

Quando si sviluppa un progetto software si utilizzano spesso librerie di terze parti. Pensare di sviluppare un progetto PHP senza l’utilizzo di librerie esterne è un altro errore che si può commettere. Un software professionale è una variabile economica complessa. E’ molto difficile stimarne i costi e di conseguenza i ricavi. L’utilizzo di componenti di terze parti consente sicuramente di ridurre i costi. Non ha senso perdere del tempo a scrivere e testare una funzionalità specifica se esistono soluzioni disponibili (open source) già utilizzate e testate da altri sviluppatori.

La scelta di quali librerie utilizzare, così come la scelta del framework di sviluppo, è un’operazione delicata e dovrebbe essere affrontata tenendo presente i seguenti punti:

– le funzionalità della libreria;
– la licenza di utilizzo;
– la popolarità del progetto;
– la documentazione;
– il supporto e l’assistenza.

Per la gestione delle dipendenze di queste librerie di terze parti è possibile utilizzare composer, uno standard de facto in PHP che consente di gestire anche l’autoloading delle classi in maniera automatica.

4) Testare il codice

Un altro aspetto importante in un progetto software sono i test unitari (e funzionali). Il modo migliore per sviluppare un progetto è quello di testare ogni riga di codice che viene scritta. In questo modo è possibile far crescere il progetto avendo delle solide fondamenta in grado di rilevare se la modifica o aggiunta prodotta non vada a “rompere” le funzionalità pre-esistenti.

I test unitari consentono di testare porzioni isolate di codice mentre quelli funzionali consentono di testare le interazioni tra codici diversi. In PHP un altro standard de facto per i test è PHPUnit.

Per migliorare la qualità di un progetto sofrware è possibile utilizzare la metodologia Test-Driven Development (TDD) che consiste nello scrivere i test prima del codice. In questo modo vengono anche chiarite le specifiche e le reali funzionalità del codice. Un’altra metodologia, basata su TDD, è la Behavior-Driven Development (BDD). Questa pratica si focalizza sui comportamenti più che sulle singole funzionalità, consentendo di astrarre e di verificare le esigenze di business in maniera più agevole.

5) Log

Per poter gestire un’applicazione software in esecuzione è di fondamentale importanza avere dei log a disposizione per verificarne il comportamento. Quando si verifica un errore, è necessario avere uno strumento che consenta di capire cosa è successo per poterlo replicare e quindi risolvere. I log rappresentano uno strumento efficace se opportunamente configurati e utilizzati. I log del web server non sono sufficienti per poter rilevare le anomalie di un’applicazione. E’ necessario implementare un log a livello dell’applicazione per poter intercettare tutte le operazioni che possono generare errori, come ad esempio l’esecuzione di un interrogazione al database.

In PHP esistono diverse librerie per la gestione dei log, come ad esempio monolog.

6) Gestione degli errori e delle eccezioni

La gestione degli errori e delle eccezioni generate da un’applicazione PHP è un altro aspetto fondamentale. Il PHP genera una lista di errori, warning e notice (informazioni) che dovrebbe essere costantemente analizzata per poter rilevare comportamenti inaspettati. Questi messaggi generati dal PHP vengono memorizzati in un file di log. E’ possibile personalizzare la gestione di questi errori utilizzando la funzione set_error_handler() per memorizzare, ad esempio, le informazioni in un database per agevolarne la ricerca.

Il PHP 7 offre una nuova gerarchia delle eccezioni basata sull’interfaccia Throwable. Le eccezioni generate sono di tipo Error o Exception. Gli Error sono eccezioni generate dall’interprete PHP mentre le Exception vengono generate a livello applicativo. Tra gli Error ci sono anche eccezioni del tipo ParseError, che consentono di rilevare errori di parsing del codice PHP. Questo è un aspetto interessante del PHP 7 che consente di personalizzare e gestire errori a run-time di qualsiasi tipo.

7) File di configurazione

I parametri fondamentali di un’applicazione web dovrebbero essere sempre gestiti tramite file di configurazione. Ad esempio, la connessione a un database dovrebbe essere gestita con un file di configurazione. Inoltre, i file di configurazione dovrebbero consentire la gestione dei vari ambienti di esecuzione dell’applicazione, come l’ambiente di sviluppo, test e produzione.

Spesso questi file di configurazione sono memorizzati in vari formati come Json, Yaml o Ini. Una gestione efficiente dei file di configurazione può avvenire anche direttamente in PHP, utilizzando gli array associativi e la funzione require. Di seguito è riportato un esempio:

// config.php
return [
‘db’ => [
‘dsn’ => ‘mysql:dbname=test;host=127.0.0.1’,
‘user’ => ‘test’,
‘password’ => ‘dH34f23q8Bvdrt34’
] ];

// index.php
$config = require ‘config.php’; // $config[‘db’][‘dsn’]

8) Deploy in produzione

Il passaggio di un progetto PHP in produzione, il cosiddetto deploy, è un altro aspetto fondamentale da pianificare e gestire con gli strumenti opportuni. Anche se è possibile copiare semplicemente i sorgenti PHP in un ambiente di produzione, non è consigliabile seguire questa strada. E’ necessario utilizzare una procedura che consenta di eseguire il deploy in maniera automatizzata sui server in produzione. Inoltre è necessario prevedere un meccanismo che consenta di ridurre al minimo, idealmente azzerare, il downtime dell’applicazione. Devono anche essere presenti dei meccanismi di rollback per ripristinare lo stato precedente dell’applicazione in caso di errori.

Esistono diverse soluzioni in PHP per il deploy di un’applicazione, come ad esempio Deployer e Ansible. Inoltre si possono utilizzare dei sistemi di virtualizzazione come Docker che consentono di eseguire il deploy in maniera isolata.

9) Persistenza dei dati

La persistenza dei dati è un altro aspetto fondamentale di ogni applicazione web. La maggior parte delle applicazioni PHP in circolazione utilizza il database MySQL ma il PHP è in grado di comunicare con una grande varietà di tecnologie come PostreSQL, Oracle, IBM DB2, Microsoft SQL Server, SQLite, Informix, MongoDB…

La scelta del database da utilizzare è ovviamente legata alle esigenze di business e alla conoscenza tecnica del team di sviluppo. In particolare, la scelta tra SQL o NoSQL dovrebbe essere legata a reali considerazioni sul caso d’uso e non dettata da semplici trend esterni. Una volta che si è scelto il database da utilizzare e l’applicazione è andata in produzione, un cambio delle tecnologia potrebbe rilevarsi un processo oneroso e non sempre conveniente in termini di business.

Per agevolare comunque la gestione della persistenza dei dati si possono utilizzare degli strumenti che consentono di astrarre l’accesso come PDO, un’estensione PHP in grado di gestire più database SQL con la stessa interfaccia o Doctrine, un Object Relational Mapper (ORM) per la gestione delle basi di dati con un livello di astrazione superiore.

10) Sicurezza

Ultimo aspetto, ma non meno importante, è quello della sicurezza di un’applicazione web. Il PHP offre numerose funzionalità per la messa in sicurezza di dati sensibili. Ad esempio le funzioni password_hash() e password_verify() per la memorizzazione sicura delle password degli utenti, tramite gli algoritmi bcrypt o Argon2 (a partire dal PHP 7.2). Inoltre, a partire dal PHP 7.1 è possibile utilizzare la funzione di cifratura e autenticazione (Authenticated Encrypt with Associated Data) della libreria OpenSSL utilizzando le funzioni openssl_encrypt() e openssl_decrypt().

Oltre agli aspetti di cifratura il PHP offre numerose altre funzioni per prevenire SQL injection o per filterare i dati in ingresso di un’applicazione web.

L’ultima versione 7.2 prevista per fine novembre, includerà anche l’estensione Sodium, per l’utilizzo di crittografia avanzata. Il PHP è di fatto l’unico linguaggio di programmazione ad avere queste funzionalità avanzate di sicurezza.

Per sapere tutto sul PHP 7 e le sue novità, è disponibile in formato digitale o cartaceo il libro di Enrico Zimuel “Sviluppare in PHP 7. II edizione“.

sviluppare php 7 meetup milano