Come migrare il tuo codice da PHP 7.4 a 8.1
Con la recente fine del ciclo di vita di PHP 7.4, è tempo di migrare il tuo codice. Ecco alcune opzioni per farlo.
La fine del ciclo di vita (EOL) di PHP 7.4 è stata lunedì 28 novembre 2022. Se sei come me, quella data è arrivata molto più velocemente del previsto. Anche se il tuo codice PHP 7.4 non smetterà di funzionare immediatamente, devi iniziare a fare piani per il futuro di questa base di codice.
Quali sono le tue opzioni?
Potresti continuare a rimanere su PHP 7.4, ma ci sono diversi vantaggi nell'aggiornare. I maggiori sono i rischi per la sicurezza e il supporto. Man mano che ci allontaniamo sempre di più dalla data EOL, gli aggressori concentreranno la loro attenzione su PHP 7.4 sapendo che qualsiasi vulnerabilità scoperta non verrà risolta nella maggior parte dei sistemi. Rimanere su PHP 7.4 aumenta drasticamente il rischio che il tuo sito venga compromesso in futuro. Allo stesso modo, trovare supporto per i problemi riscontrati con PHP 7.4 diventerà sempre più difficile. Inoltre, molto probabilmente inizierai a riscontrare problemi di compatibilità con codici/pacchetti di terze parti mentre aggiornano il loro codice per essere compatibile con le versioni successive e abbandonano il supporto per 7.4. Ti perderai anche i miglioramenti significativi in termini di velocità e prestazioni introdotti nella versione 8.0 e ulteriormente migliorati nella versione 8.1. Ma aggiornare tutto quel codice legacy è scoraggiante!
Dove iniziare?
Fortunatamente, PHP fornisce una guida ufficiale alla migrazione da PHP 7.4 a 8.0 per iniziare (e anche una guida alla migrazione da 8.0 a 8.1). Assicurati di leggere le sezioni Modifiche incompatibili con le versioni precedenti e Funzionalità deprecate. Sebbene queste guide siano incredibilmente utili, potresti benissimo avere decine di migliaia di righe di codice da controllare, alcune delle quali potresti aver ereditato. Fortunatamente ci sono alcune opzioni che aiutano a individuare potenziali aree problematiche nella migrazione.
PHPCodeSniffer + PHPCompatibility sniffa
PHPCodeSniffer (PCS) è un pacchetto per il controllo della sintassi del codice PHP. Controlla il tuo codice rispetto a una raccolta di regole definite (dette anche "sniff") denominate "standard". PHPCodeSniffer viene fornito con una raccolta di standard che puoi utilizzare tra cui PEAR, PSR1, PSR2, PSR12, Squiz e Zend. Fortunatamente, puoi scrivere la tua raccolta di sniff per definire qualsiasi insieme di regole che preferisci.
PHPCompability è entrato nella chat
PHPCompatibility "è un insieme di sniff per PHP CodeSniffer che verifica la compatibilità tra versioni PHP" che ti consente di testare la compatibilità della tua base di codice con diverse versioni di PHP, incluse PHP 8.0 e 8.1. Ciò significa che puoi utilizzare PHPCodeSniffer per scansionare la tua base di codice, applicando le regole di PHPCompability per individuare eventuali incompatibilità con PHP 8.1 che potrebbero essere presenti.
Prima di continuare…
Anche se PHP8.2 è stato rilasciato l'8 dicembre 2022 e ti incoraggio a iniziare a consultare la guida ufficiale alla migrazione da 8.1 a 8.2 e a pianificare l'aggiornamento, la maggior parte dei controllori che menziono in questo articolo non hanno completato il supporto completo per 8.2. in questo momento. Per questi motivi, mi concentrerò sulla migrazione del codice su PHP8.1 e non su 8.2.
Durante la stesura di questo articolo, ho scoperto che PHPCompatiblity presenta un problema noto durante la verifica della compatibilità con PHP 8.0/8.1 in cui segnala problemi che dovrebbero essere Errori come Avvisi. L'unica soluzione alternativa per ora è utilizzare il ramo develop
per PHPCompatibility invece di master
. Anche se affermano che è stabile, tieni presente che in questo articolo sto utilizzando il ramo non stabile. Potresti voler valutare i pro e i contro dell'utilizzo del ramo develop
prima di implementarlo altrove che in un ambiente di sviluppo locale. Anche se ho trovato PCS+PHPCompatibility la soluzione più semplice e completa per verificare la presenza di codice incompatibile, se non desideri utilizzare una versione non stabile di PCS, consulta la sezione alla fine dell'articolo sulle opzioni alternative.
Ai fini di questo articolo, utilizzerò la versione 1.4.6 di SimpleSAMLphp per verificare le incompatibilità. Questa è una versione vecchia di sei anni del codice base. Lo faccio non per prendermela con SimpleSAMLphp, ma perché volevo qualcosa che sicuramente presentasse degli errori. A quanto pare, tutto il codice platform.sh che ho testato, così come il mio codice, era già compatibile con PHP8.1 e non richiedeva modifiche.
Iniziare
Per iniziare, clona prima la tua codebase, quindi crea un nuovo ramo. Ora dovrai decidere se desideri installare le dipendenze ed eseguire le scansioni sul tuo computer locale o in un ambiente di sviluppo locale utilizzando qualcosa come DDEV, Lando o Docksal. In questa demo, sto usando DDEV. Suggerisco di utilizzare un ambiente di sviluppo locale invece di eseguirlo direttamente sul tuo computer locale perché, sebbene non sia necessario utilizzare la versione di PHP con cui desideri eseguire il test, per ottenere i migliori risultati è consigliabile farlo. Se non hai PHP installato o non hai la versione di destinazione installata, un ambiente di sviluppo locale ti consente di creare un ambiente temporaneo con esattamente ciò di cui hai bisogno senza cambiare la tua macchina.
Dopo aver configurato l'ambiente per PHP 8.1, al prompt del terminale (nel mio caso, ho eseguito ddev start
e una volta che i contenitori sono disponibili, esegui la shell nell'app Web utilizzando ddev ssh
), è necessario aggiungere questi nuovi pacchetti in modo da poterli utilizzare per i test. Li aggiungerò con Composer, tuttavia, ci sono diversi modi per installarli se preferisci farlo diversamente. Se la tua codebase non utilizza già il compositore, dovrai eseguire il compositore init prima di continuare.
Poiché utilizzerai il ramo di sviluppo di PHPCompatibility, ci sono un paio di passaggi aggiuntivi da eseguire che non sono presenti nelle normali istruzioni di installazione. Il primo è che il ramo di sviluppo di PHPCompatibility richiede una versione alpha di phpcsstandards/phpcsutils
. Poiché è contrassegnato come alfa, dovrai far sapere al compositore che è possibile installare questo pacchetto anche se è al di sotto dei requisiti minimi di stabilità.
$compositore require --dev phpcsstandards/phpcsutils:"^1.0@dev"
Successivamente, installa PHPCompatibility indirizzando il ramo develop
$compositore richiede --dev phpcompatibility/php-compatibility:dev-develop
Il ramo develop
installa anche dealerdirect/phpcodesniffer-composer-installer
quindi non è necessario aggiungerlo manualmente o indirizzare PCS a questo nuovo standard.
Per verificare che i nostri nuovi standard siano installati, il PCS visualizzerà gli standard di cui è a conoscenza.
$ phpcs -i
The installed coding standards are MySource, PEAR, PSR1, PSR2, PSR12, Squiz, Zend, PHPCompatibility, PHPCS23Utils and PHPCSUtils
Ora che sai che i tuoi standard sono disponibili, puoi fare in modo che PCS esegua la scansione del nostro codice. Per indicare a PCS di utilizzare uno standard specifico, utilizzare l'opzione --standard
e dirgli di utilizzare PHPCompatibility
. Tuttavia, devi anche indicare a PHPCompatibility con quale versione PHP vuoi testare. Per questo, usa l'opzione --runtime-set
di PCS e passagli la chiave testVersion
e il valore di 8.1
.
Prima di avviare la scansione, l'unico problema rimanente è che il codice che vuoi scansionare si trova nella radice del progetto (.
) ma anche il vendor
è direttamente nel progetto radice. Non vuoi che il codice in vendor
venga scansionato, poiché quelli non sono pacchetti che controlli necessariamente. PCS ti permette di dirgli di non scansionare file/directory con l'opzione --ignore
. Infine, vuoi vedere l'avanzamento mentre PCS analizza il file, quindi passerai l'opzione -p
.
Mettere tutto insieme:
Questo avvia PCS che mostrerà i suoi progressi mentre esegue la scansione del codice del tuo progetto. W
indica Avvisi e E
indica Errori. Al termine della scansione verrà restituito: un rapporto completo con il file contenente il problema, il numero di riga in cui si verifica il problema, se il problema è un Avviso o un Errore e il problema specifico scoperto.
In generale, gli errori sono cose che causeranno un errore fatale in PHP 8.1 e dovranno essere corretti prima di poter eseguire la migrazione. Gli avvisi possono essere elementi deprecati nella versione 8.0/8.1 ma non ancora rimossi oppure problemi riscontrati da PCS durante il tentativo di analizzare il file.
Dato che il report potrebbe essere lungo e viene visualizzato tutto in una volta nel terminale, sono disponibili numerose opzioni per modificare le informazioni incluse nel report, nonché più formati di report.
Quando inizi a correggere il codice, puoi eseguire nuovamente il report tutte le volte necessarie. Tuttavia, a un certo punto, dovrai testare il codice su un vero ambiente PHP8.1 con dati reali. Se utilizzi Platform.sh, è facile come creare un ramo, modificare una singola riga nel file di configurazione e inviarci quel ramo. Puoi guardare questo video per vedere quanto è facile!
C'è troppo da sistemare!
Ora che hai un'idea chiara di ciò che deve essere aggiornato prima di poter eseguire la migrazione, potresti dover affrontare un'incredibile quantità di lavoro davanti a te. Fortunatamente, hai alcune opzioni per aiutarti. PCS viene fornito con un riparatore di codice chiamato PHP Code Beautifier and Fixer (phpcbf
). L'esecuzione di phpcbf è quasi identica all'esecuzione di phpcs e la maggior parte delle opzioni sono identiche. L'altra opzione è Rettore. L'utilizzo di questi strumenti va oltre lo scopo di questo articolo ma, come per qualsiasi automazione, ti consigliamo di testarli e verificarli prima di promuovere modifiche alla produzione.
Opzioni alternative
Se per qualsiasi motivo non ti senti a tuo agio nell'usare una versione non stabile di PCS, hai altre opzioni per controllare il tuo codice.
Fan
Phan è un analizzatore di codice statico per PHP. Offre più livelli di analisi e consente di rafforzare in modo incrementale tale analisi.
“L’analisi statica deve essere introdotta lentamente se vuoi evitare che la tua squadra perda la testa. "
Phan non mira solo alla compatibilità con le versioni più recenti, ma può evidenziare aree di codice che potrebbero presentare errori nelle versioni successive. Tuttavia, ci sono alcune avvertenze quando si utilizza Phan per verificare la compatibilità:
- Più lento della compatibilità PCS+PHP.
- Phan richiede l'estensione ast php che non è disponibile per impostazione predefinita su Platform.sh (o in DDEV). Dovrai installarlo nel tuo ambiente di sviluppo locale e aggiungerlo al tuo file php.ini. In alternativa, puoi utilizzare l'opzione
--allow-polyfill-parser
, ma è notevolmente più lenta. - L'output di reporting predefinito di Phan non è facile da leggere come altre opzioni
- Mi sono imbattuto in un problema per cui se la tua base di codice imposta una directory
vendor
diversa tramite[config:vendor-dir](https://getcomposer.org/doc/06-config.md) del compositore #vendor-dir)
, verrà visualizzato un errore indicante che non è possibile trovare determinati file nella directoryvendor
- Come accennato, Phan analizza molto più della semplice compatibilità con PHP8.1. Sebbene sia sicuramente un punto di forza in altre situazioni, se il tuo obiettivo è migrare dalla versione 7.4 alla versione 8.1 il più rapidamente possibile, dovrai analizzare errori non correlati alla compatibilità della versione.
- Richiede che tu lo esegua sulla versione PHP che desideri scegliere come target
PHPStan
Similmente a Phan, PHPStan è un analizzatore di codice statico per PHP che promette di “trovare bug senza scrivere test. E si applicano una serie di avvertenze simili:
- Più lento di PCS o Phan
- Analizza molto più della semplice compatibilità con PHP8.1, quindi a seconda della tua base di codice attuale, dovrai eventualmente analizzare una serie di errori che non sono correlati alla compatibilità della versione
- Richiede che tu lo esegua sulla versione PHP che desideri scegliere come target
Lint parallelo PHP
Un linter PHP molto veloce che può eliminare eventuali problemi dalla base di codice, ma può anche verificare eventuali deprecazioni. Sebbene sia eccezionalmente veloce, è solo un linter e pertanto può solo far emergere deprecazioni lanciate in fase di compilazione, non in fase di esecuzione. Nel mio codice di esempio, sono state trovate solo 2 deprecazioni rispetto alle 960 deprecazioni scoperte dal PCS.
Riepilogo
Le migrazioni del codice, sebbene non siano mai divertenti, sono fondamentali per ridurre al minimo il rischio organizzativo. Platform.sh ti offre la flessibilità di testare il tuo codice utilizzando gli stessi dati e configurazioni del tuo sito di produzione, ma in un ambiente isolato. Combina questo con gli strumenti di cui sopra e avrai tutto ciò di cui hai bisogno per una migrazione del codice forte ed efficiente.
Questo articolo è stato originariamente pubblicato sul sito della community Platform.sh ed è stato ripubblicato con autorizzazione.