PHP da EGPHP
Tutto ciò che costruiamo parte da PHP.
Il nostro team scrive e gestisce PHP da venticinque anni, fin da PHP 4. I server, il pannello di controllo e i siti che seguiamo partono tutti da qui.
Venticinque anni, versione dopo versione
Queste versioni non le conosciamo per sentito dire. Abbiamo aggiornato siti veri attraverso ciascuna di esse, e ogni riga qui sotto è un cambiamento che abbiamo dovuto affrontare su un server in produzione.
-
PHP 4 2000
Sessioni e buffering dell'output, integrati
È arrivato lo Zend Engine, e sessioni e buffering dell'output sono diventati parte del linguaggio anziché componenti aggiuntivi. Su questa base è stata scritta un'intera generazione dei primi siti dinamici.
Zend Enginesession_start()ob_start()
Cosa ha significato per noiIl punto di partenza del nostro team: siti scritti a mano su server condivisi, con register_globals ancora attivo.
-
PHP 5.0 2004
Un vero modello a oggetti
Lo Zend Engine 2 ha portato classi con visibilità, interfacce ed eccezioni, oggetti passati per handle anziché copiati, e le estensioni MySQLi e SimpleXML.
privateinterfacetry / catchmysqli
Cosa ha significato per noiIl codice si poteva organizzare in classi condivise da un team, e il database ha avuto un driver moderno.
-
PHP 5.3 2009
Namespace e closure
Namespace, funzioni anonime e late static binding: le fondamenta su cui sono stati costruiti in seguito Composer e l'ecosistema dei pacchetti condivisi.
namespacefunction () use ()static::
Cosa ha significato per noiLibrerie di autori diversi potevano finalmente convivere nello stesso progetto senza conflitti di nomi.
-
PHP 5.4 2012
Trait, array brevi e un po' di pulizia Ha rotto il codice vecchio
Trait, la sintassi breve [] per gli array e un server di sviluppo integrato, mentre register_globals, magic quotes e safe mode sono stati eliminati per sempre.
trait[ ]php -S
Cosa ha significato per noiI vecchi siti che si affidavano a register_globals hanno smesso di funzionare, e aggiornarli significava prima correggerli.
-
PHP 5.5 2013
OPcache di serie
OPcache è entrato a far parte di PHP stesso e ha iniziato a tenere in memoria gli script compilati; nella stessa versione sono arrivati i generatori e password_hash().
opcacheyieldpassword_hash()
Cosa ha significato per noiIl codice compilato resta in memoria invece di essere riletto a ogni richiesta. È ancora la prima impostazione che controlliamo su qualsiasi server PHP.
-
PHP 6 mai uscita
La versione mai uscita
PHP 6 era stato progettato attorno alle stringhe Unicode native ed è stato abbandonato. La versione successiva è stata numerata 7 per non confonderla con i libri e i piani scritti per la 6.
-
PHP 7.0 2015
Il salto di velocità Ha rotto il codice vecchio
Un motore ricostruito, che il progetto PHP ha descritto come fino a due volte più veloce della 5.6 consumando meno memoria, più le dichiarazioni di tipo scalari e di ritorno, ?? e <=>.
int $id: string??<=>
Cosa ha significato per noiLe vecchie funzioni mysql_* sono state rimosse: un motivo frequente per cui un vecchio sito si rompeva con questo aggiornamento.
-
PHP 7.4 2019
Proprietà tipizzate e preloading
Proprietà tipizzate, arrow function, l'operatore ??=, il preloading di OPcache e FFI.
public int $idfn ($x) =>??=
Cosa ha significato per noiL'ultima versione 7.x, e quella su cui molte applicazioni più vecchie sono rimaste più a lungo: per questo spostiamo ancora oggi siti che la usano.
-
PHP 8.0 2020
JIT, attributi e argomenti nominali Ha rotto il codice vecchio
Un compilatore JIT, attributi, argomenti nominali, union type, match, l'operatore nullsafe ?-> e la promozione delle proprietà nel costruttore.
#[Attribute]match?->JIT
Cosa ha significato per noiMolti avvisi sono diventati errori e i confronti tra stringhe e numeri sono cambiati: il codice che girava tranquillo sulla 7.4 poteva fermarsi sull'8.0.
-
PHP 8.1 2021
Enum, readonly e fiber
Enum nativi, proprietà readonly, fiber, il tipo di ritorno never e la sintassi first-class callable.
enumreadonlyFibernever
Cosa ha significato per noiI fiber hanno aperto la strada a librerie PHP asincrone senza cambiare il modo in cui gira una normale richiesta.
-
PHP 8.2 2022
Classi readonly, e un avviso per il vecchio codice
Classi readonly, tipi DNF, true, false e null come tipi autonomi, e una nuova estensione Random.
readonly class(A&B)|nullRandom\Randomizer
Cosa ha significato per noiLe proprietà dinamiche sono state deprecate, e i plugin più vecchi hanno riempito i log di avvisi finché non sono stati aggiornati.
-
PHP 8.3 2023
Costanti tipizzate e #[\Override]
Costanti di classe tipizzate, l'attributo #[\Override], json_validate() e l'accesso dinamico alle costanti di classe.
const string#[\Override]json_validate()
Cosa ha significato per noiUna versione più tranquilla, e proprio per questo un passo facile per i siti già sull'8.2.
-
PHP 8.4 2024
Hook sulle proprietà
Hook sulle proprietà, visibilità asimmetrica, oggetti lazy, un parser DOM compatibile con HTML5, e new MyClass()->method() senza le parentesi in più.
get { }public private(set)Dom\HTMLDocument
Cosa ha significato per noiGetter e setter che prima richiedevano un metodo ciascuno ora appartengono alla proprietà stessa, quindi c'è meno codice da mantenere.
-
PHP 8.5 2025
L'operatore pipe Attuale
L'operatore pipe |>, un'estensione URI integrata, clone with, l'attributo #[\NoDiscard], array_first() e array_last(), e un backtrace sugli errori fatali.
|>Uri\Rfc3986\Uriclone($o, [ ])
Cosa ha significato per noiLa linea di versioni attuale, quella su cui avviamo i nuovi siti quando il loro codice la supporta.
Gli anni sono quelli della prima uscita di ciascuna versione, secondo la cronologia ufficiale delle release del progetto PHP.
Segui una richiesta lungo lo stack
Una pagina di un sito PHP attraversa cinque livelli all'andata e risale per gli stessi cinque al ritorno. Ci occupiamo di ognuno di essi, e ciascuno ha la sua pagina.
-
Il visitatore
Un browser chiede una pagina via HTTPS. Il certificato, il firewall e le regole davanti al server decidono se la richiesta può anche solo entrare.
-
Il web server
Nginx o LiteSpeed accetta la connessione, serve da sé immagini e file, e passa solo il lavoro PHP al pool che sta dietro.
-
Il runtime PHP
Pool PHP-FPM, uno per sito, ciascuno sulla versione di PHP che serve al suo codice, con OPcache già caldo e worker dimensionati sul traffico.
-
Il tuo codice
Un framework o una piattaforma pronta trasforma la richiesta in una pagina: la tua applicazione Laravel, oppure WordPress, Magento, Moodle e tutte le altre.
-
I dati
MySQL o MariaDB conserva i record, e Redis tiene in memoria ciò che viene richiesto più e più volte.
Il server stesso
I nostri server, gestiti dallo stesso team, con sopra il nostro pannello di controllo.
Passare a un PHP più recente senza brutte mattinate
Ogni sito ha il suo pool, così un solo server può far girare più versioni di PHP una accanto all'altra, e ogni sito passa alla nuova quando è pronto il suo codice, non quando lo è il server.
Elenchiamo cosa usa ogni sito
La versione di PHP, le estensioni, e i plugin o i pacchetti che lo tengono indietro.
Una copia prova la nuova versione
Il sito viene copiato e fatto girare sulla versione successiva di PHP, e il suo log degli errori viene letto riga per riga.
Sistemiamo ciò che si rompe
Funzioni rimosse, chiamate deprecate e plugin senza aggiornamenti vengono corretti o sostituiti.
Un sito alla volta
Ogni sito passa al suo nuovo pool per conto proprio, e può tornare subito indietro se è sfuggito qualcosa.
| Sito | PHP | Pool | Stato |
|---|---|---|---|
| shop.example.com | 8.4 | fpm-shop | attivo |
| blog.example.com | 8.3 | fpm-blog | attivo |
| crm.example.com | 7.4 → 8.3 | fpm-crm | su una copia |
| learn.example.com | 8.3 | fpm-learn | attivo |

Portaci il tuo PHP
Un vecchio sito che ha bisogno di un PHP più recente, una piattaforma da installare o un server su cui far girare tutto. Per ogni lavoro prepariamo un preventivo dopo una breve chiacchierata.