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.

  1. 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 Engine
    • session_start()
    • ob_start()
    Cosa ha significato per noi

    Il punto di partenza del nostro team: siti scritti a mano su server condivisi, con register_globals ancora attivo.

  2. 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.

    • private
    • interface
    • try / catch
    • mysqli
    Cosa ha significato per noi

    Il codice si poteva organizzare in classi condivise da un team, e il database ha avuto un driver moderno.

  3. 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.

    • namespace
    • function () use ()
    • static::
    Cosa ha significato per noi

    Librerie di autori diversi potevano finalmente convivere nello stesso progetto senza conflitti di nomi.

  4. 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 noi

    I vecchi siti che si affidavano a register_globals hanno smesso di funzionare, e aggiornarli significava prima correggerli.

  5. 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().

    • opcache
    • yield
    • password_hash()
    Cosa ha significato per noi

    Il codice compilato resta in memoria invece di essere riletto a ogni richiesta. È ancora la prima impostazione che controlliamo su qualsiasi server PHP.

  6. 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.

  7. 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 noi

    Le vecchie funzioni mysql_* sono state rimosse: un motivo frequente per cui un vecchio sito si rompeva con questo aggiornamento.

  8. PHP 7.4 2019

    Proprietà tipizzate e preloading

    Proprietà tipizzate, arrow function, l'operatore ??=, il preloading di OPcache e FFI.

    • public int $id
    • fn ($x) =>
    • ??=
    Cosa ha significato per noi

    L'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.

  9. 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 noi

    Molti 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.

  10. PHP 8.1 2021

    Enum, readonly e fiber

    Enum nativi, proprietà readonly, fiber, il tipo di ritorno never e la sintassi first-class callable.

    • enum
    • readonly
    • Fiber
    • never
    Cosa ha significato per noi

    I fiber hanno aperto la strada a librerie PHP asincrone senza cambiare il modo in cui gira una normale richiesta.

  11. 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)|null
    • Random\Randomizer
    Cosa ha significato per noi

    Le proprietà dinamiche sono state deprecate, e i plugin più vecchi hanno riempito i log di avvisi finché non sono stati aggiornati.

  12. 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 noi

    Una versione più tranquilla, e proprio per questo un passo facile per i siti già sull'8.2.

  13. 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 noi

    Getter e setter che prima richiedevano un metodo ciascuno ora appartengono alla proprietà stessa, quindi c'è meno codice da mantenere.

  14. 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\Uri
    • clone($o, [ ])
    Cosa ha significato per noi

    La 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. I dati

    MySQL o MariaDB conserva i record, e Redis tiene in memoria ciò che viene richiesto più e più volte.

Sotto tutti e cinque

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.

  1. Elenchiamo cosa usa ogni sito

    La versione di PHP, le estensioni, e i plugin o i pacchetti che lo tengono indietro.

  2. 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.

  3. Sistemiamo ciò che si rompe

    Funzioni rimosse, chiamate deprecate e plugin senza aggiornamenti vengono corretti o sostituiti.

  4. Un sito alla volta

    Ogni sito passa al suo nuovo pool per conto proprio, e può tornare subito indietro se è sfuggito qualcosa.

php-fpmUn server, più versioni
SitoPHPPoolStato
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
Un server di esempio

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.