AGGIORNAMENTO E UPGRADE · PHP VANILLA

Codice custom su PHP 8.
Senza riscrivere l’applicazione.

Portiamo su PHP 8 gestionali e portali scritti senza framework, sostituendo mysql_* con PDO e introducendo Composer, autoload e test prima di toccare la logica.

Per applicazioni nate quindici o vent’anni fa, cresciute per aggiunte con catene di include, funzioni globali e librerie copiate a mano, ferme su PHP 5 o 7 perché ogni modifica fa paura.

PERCORSO DI UPGRADE

Dal ramo che hai.
Al ramo supportato.

Nel codice custom il percorso segue i rami di PHP. Le due tappe che rompono più codice sono PHP 7.0 e PHP 8.0, quindi prima mettiamo ordine e creiamo i test, poi attraversiamo i rami uno alla volta.

  1. 01Codice su PHP 5.xPHP 5.6

    Funzioni mysql_*, ereg e include a catena, nessun test

  2. 02Composer e testPHP in uso

    Autoload e test di caratterizzazione, senza cambiare il comportamento

  3. 03PDO e PHP 7.4PHP 7.4

    Uno strato di accesso unico al database e le deprecazioni della serie 7 corrette

  4. 04PHP 8 supportatoPHP 8.3 – 8.5

    Rimozioni di PHP 8.0 e cambi di comportamento verificati con i test

VERSIONI E REQUISITI PHP

Cosa si rompe.
Ramo per ramo.

Le rimozioni e i cambiamenti che incontriamo più spesso nel codice legacy, secondo le guide di migrazione del manuale di PHP.

PassaggioCosa si rompe o cambiaCome si corregge
PHP 5.6 → 7.0rimosse le estensioni mysql e mssql, le funzioni ereg, il modificatore /e di preg_replace() e i tag ASPPDO o mysqli, funzioni PCRE, preg_replace_callback()
PHP 7.0 → 7.4mcrypt esce dalla distribuzione standard in 7.2; deprecati each(), create_function(), __autoload() e le parentesi graffe sulle stringhelibrerie di cifratura mantenute, foreach, funzioni anonime, spl_autoload_register()
PHP 7.4 → 8.0rimosso quasi tutto ciò che era deprecato nella serie 7, costruttori in stile PHP 4 ignorati, nuovi confronti tra numeri e stringhecostruttori __construct(), confronti stretti, test sui percorsi critici
PHP 8.0 → 8.1deprecato il passaggio di null ai parametri non annullabili delle funzioni interne, strftime() e FILTER_SANITIZE_STRINGcontrolli espliciti sui valori, IntlDateFormatter, htmlspecialchars()
PHP 8.1 → 8.2deprecate le proprietà dinamiche, utf8_encode(), utf8_decode() e l’interpolazione ${variabile}proprietà dichiarate, mb_convert_encoding(), interpolazione {$variabile}
PHP 8.3 → 8.4 e 8.5deprecati i parametri implicitamente annullabili; IMAP, OCI8 e PSpell passano a PECL; in 8.5 deprecati backtick e cast non canonicitipi ?tipo espliciti, estensioni installate da PECL, shell_exec() e cast (int)

Fonti: Migrazione a PHP 7.0 · Migrazione a PHP 8.0 · Rami di PHP non più supportati. La matrice dei rami di PHP con le distribuzioni Linux è nella pagina Versioni PHP.

COSA TROVIAMO DI SOLITO

Cosa blocca l’upgrade.
E come lo sblocchiamo.

Senza un framework ogni progetto ha una struttura propria. I blocchi però si ripetono quasi sempre negli stessi punti.

Accesso al database con mysql_*

Le funzioni mysql_* non esistono più da PHP 7.0 e sono sparse in centinaia di file. Le concentriamo in uno strato di accesso unico basato su PDO, poi parametrizziamo le query a partire da quelle che ricevono dati dall’esterno.

Include a catena

L’ordine delle inclusioni è fragile e la stessa classe arriva da percorsi diversi. Con Composer usiamo classmap per il codice esistente, psr-4 per quello nuovo e files per le funzioni globali.

Nessun test

Senza test l’unico modo di scoprire una regressione è la segnalazione di un utente. Scriviamo test di caratterizzazione che fissano il comportamento attuale dei flussi critici, come login, ordini e fatturazione.

Librerie copiate a mano

Generatori di PDF, client SOAP e classi per l’email sono spesso versioni vecchie, a volte modificate. Le confrontiamo con l’originale e le sostituiamo con i pacchetti mantenuti, aggiornandole per gradi.

Errori che non si vedono

Confronti tra numeri e stringhe, avvisi promossi a eccezioni e costruttori in stile PHP 4 non danno errori di sintassi. Li cerchiamo con PHPCompatibility, PHPStan ed esecuzione con error_reporting = E_ALL.

Dati cifrati e charset

Con mcrypt serve sapere algoritmo, modalità e padding prima di cambiare libreria. Con il passaggio a PDO verifichiamo anche il charset della connessione, per non rovinare i caratteri accentati salvati negli anni.

IL METODO

Il nostro intervento.
Passo dopo passo.

Se la migrazione richiede tempo, nel frattempo teniamo protetto il PHP in uso con il backport delle patch di sicurezza.

  1. 01INVENTARIO

    Inventario e matrice

    Rileviamo versione di PHP ed estensioni in produzione, librerie incluse e flussi critici. Con ricerca testuale e analisi statica misuriamo la distanza da PHP 8, file per file.

  2. 02STAGING

    Ordine prima delle modifiche

    Introduciamo Composer, l’autoload e i test di caratterizzazione senza cambiare il comportamento, così possono andare in produzione presto. Sulle versioni vecchie di PHP usiamo Composer 2.2 LTS.

  3. 03UPGRADE

    Correzioni per gradi

    Sostituiamo mysql_* con PDO e correggiamo le incompatibilità ramo per ramo, in un ambiente di prova con l’applicazione reale. Le modifiche compatibili con entrambe le versioni escono subito.

  4. 04RILASCIO

    Rilascio e ponte

    Il rilascio sul nuovo PHP avviene con Ansible e un piano di rollback. Fino ad allora il backport delle patch di sicurezza tiene protetto il PHP fuori supporto in uso.

DOMANDE FREQUENTI

Prima di iniziare.

Le domande che ci fanno più spesso su PHP Vanilla e PHP.

Bisogna adottare un framework per migrare?

No. Composer e PHPUnit si aggiungono accanto al codice esistente e non richiedono di riorganizzare il progetto. La parte nuova cresce con namespace e psr-4, mentre quella storica si riduce una classe alla volta.

Meglio PDO o mysqli?

Entrambe sono mantenute e adatte alla produzione. Preferiamo PDO per i segnaposto con nome, gli errori gestiti con eccezioni e l’interfaccia unica per database diversi. Il metodo dello strato di accesso unico è lo stesso con tutte e due.

Posso usare Composer su PHP 5.6?

Sì. Le versioni correnti di Composer richiedono PHP 7.2.5 o superiore, mentre il ramo di supporto a lungo termine 2.2 funziona da PHP 5.3.2. Anche PHPUnit va scelto in base al PHP in uso, per esempio PHPUnit 5 su PHP 5.6.

Come si stima il lavoro?

Con un inventario fatto prima di aprire il primo file. Una ricerca delle funzioni rimosse dà l’ordine di grandezza in pochi minuti, l’analisi statica e l’esecuzione con tutti gli avvisi attivi completano il quadro. Da lì si capisce se il problema riguarda dieci file o trecento.

IL PROSSIMO PASSO

Aggiorniamo
il tuo codice.

Indicaci versione della piattaforma, versione di PHP e sistema operativo. Ti risponderemo con una prima valutazione del percorso di upgrade e di cosa serve per arrivarci.

Richiedi una valutazione
PHP LEGACY · MANAGED SERVER S.R.L.info@phplegacy.it +39 02 5656 9681

Lunedì – venerdì · 09:30 – 19:30

Urgenza in corso? Reperibilità H24
+39 340 985 4556 ↗