PHP chez EGPHP

Tout ce que nous construisons commence par PHP.

Cela fait vingt-cinq ans, depuis PHP 4, que notre équipe écrit et fait tourner du PHP. Les serveurs, le panneau de contrôle et les sites dont nous nous occupons partent tous de là.

Vingt-cinq ans, version après version

Nous n'avons pas découvert ces versions dans des articles. Nous avons fait passer de vrais sites par chacune d'elles, et chaque ligne ci-dessous est un changement que nous avons dû gérer sur un serveur en production.

  1. PHP 4 2000

    Sessions et tampon de sortie intégrés

    Le Zend Engine est arrivé, et les sessions comme la mise en tampon de sortie sont devenues partie intégrante du langage au lieu d'être des modules ajoutés. Toute une génération des premiers sites dynamiques a été écrite pour lui.

    • Zend Engine
    • session_start()
    • ob_start()
    Ce que cela a changé pour nous

    Là où notre équipe a commencé : des sites écrits à la main sur des serveurs mutualisés, avec register_globals encore activé.

  2. PHP 5.0 2004

    Un vrai modèle objet

    Le Zend Engine 2 a apporté des classes avec visibilité, des interfaces et des exceptions, des objets transmis par leur identifiant plutôt que copiés, ainsi que les extensions MySQLi et SimpleXML.

    • private
    • interface
    • try / catch
    • mysqli
    Ce que cela a changé pour nous

    Le code pouvait s'organiser en classes partagées par toute une équipe, et la base de données a reçu un pilote moderne.

  3. PHP 5.3 2009

    Espaces de noms et closures

    Espaces de noms, fonctions anonymes et résolution statique à la volée : le socle sur lequel Composer et l'écosystème de paquets partagés ont ensuite été construits.

    • namespace
    • function () use ()
    • static::
    Ce que cela a changé pour nous

    Des bibliothèques d'auteurs différents pouvaient enfin cohabiter dans un même projet sans conflit de noms.

  4. PHP 5.4 2012

    Traits, tableaux courts et grand ménage A cassé l'ancien code

    Les traits, la syntaxe courte [] pour les tableaux et un serveur de développement intégré, tandis que register_globals, les magic quotes et le safe mode disparaissaient pour de bon.

    • trait
    • [ ]
    • php -S
    Ce que cela a changé pour nous

    Les anciens sites qui dépendaient de register_globals ont cessé de fonctionner, et les mettre à niveau voulait d'abord dire les corriger.

  5. PHP 5.5 2013

    OPcache inclus d'office

    OPcache est arrivé avec PHP lui-même pour garder les scripts compilés en mémoire, aux côtés des générateurs et de password_hash().

    • opcache
    • yield
    • password_hash()
    Ce que cela a changé pour nous

    Le code compilé reste en mémoire au lieu d'être relu à chaque requête. C'est toujours le premier réglage que nous vérifions sur un serveur PHP.

  6. PHP 6 jamais sortie

    La version jamais sortie

    PHP 6 devait reposer sur des chaînes Unicode natives, et il a été abandonné. La version suivante a été numérotée 7 pour ne pas être confondue avec les livres et les plans écrits pour la 6.

  7. PHP 7.0 2015

    Le bond en vitesse A cassé l'ancien code

    Un moteur reconstruit, que le projet PHP présentait comme jusqu'à deux fois plus rapide que la 5.6 tout en consommant moins de mémoire, plus les déclarations de types scalaires et de types de retour, ?? et <=>.

    • int $id
    • : string
    • ??
    • <=>
    Ce que cela a changé pour nous

    Les anciennes fonctions mysql_* ont été supprimées, une raison fréquente pour laquelle un vieux site cassait lors de cette mise à niveau.

  8. PHP 7.4 2019

    Propriétés typées et préchargement

    Propriétés typées, fonctions fléchées, l'opérateur ??=, le préchargement OPcache et FFI.

    • public int $id
    • fn ($x) =>
    • ??=
    Ce que cela a changé pour nous

    La dernière version 7.x, celle sur laquelle beaucoup d'anciennes applications sont restées le plus longtemps : c'est pourquoi nous en faisons encore migrer des sites.

  9. PHP 8.0 2020

    JIT, attributs et arguments nommés A cassé l'ancien code

    Un compilateur JIT, les attributs, les arguments nommés, les types union, match, l'opérateur nullsafe ?-> et la promotion des propriétés du constructeur.

    • #[Attribute]
    • match
    • ?->
    • JIT
    Ce que cela a changé pour nous

    Beaucoup d'avertissements sont devenus des erreurs et les comparaisons entre chaînes et nombres ont changé : du code qui tournait sans bruit en 7.4 pouvait s'arrêter en 8.0.

  10. PHP 8.1 2021

    Énumérations, readonly et fibers

    Des énumérations natives, les propriétés readonly, les fibers, le type de retour never et la syntaxe callable de première classe.

    • enum
    • readonly
    • Fiber
    • never
    Ce que cela a changé pour nous

    Les fibers ont ouvert la voie aux bibliothèques PHP asynchrones sans changer le déroulement d'une requête ordinaire.

  11. PHP 8.2 2022

    Classes readonly, et un avertissement pour le vieux code

    Les classes readonly, les types DNF, true, false et null comme types autonomes, et une nouvelle extension Random.

    • readonly class
    • (A&B)|null
    • Random\Randomizer
    Ce que cela a changé pour nous

    Les propriétés dynamiques ont été dépréciées, et les anciens plugins ont rempli les journaux de notices jusqu'à leur mise à jour.

  12. PHP 8.3 2023

    Constantes typées et #[\Override]

    Les constantes de classe typées, l'attribut #[\Override], json_validate() et la récupération dynamique des constantes de classe.

    • const string
    • #[\Override]
    • json_validate()
    Ce que cela a changé pour nous

    Une version plus discrète, ce qui en fait une étape facile pour les sites déjà en 8.2.

  13. PHP 8.4 2024

    Hooks de propriété

    Les hooks de propriété, la visibilité asymétrique, les objets paresseux, un analyseur DOM compatible HTML5, et new MyClass()->method() sans les parenthèses supplémentaires.

    • get { }
    • public private(set)
    • Dom\HTMLDocument
    Ce que cela a changé pour nous

    Les getters et setters qui demandaient chacun une méthode appartiennent désormais à la propriété elle-même : il y a moins de code à maintenir.

  14. PHP 8.5 2025

    L'opérateur pipe Actuelle

    L'opérateur pipe |>, une extension URI intégrée, clone with, l'attribut #[\NoDiscard], array_first() et array_last(), et une trace d'appels sur les erreurs fatales.

    • |>
    • Uri\Rfc3986\Uri
    • clone($o, [ ])
    Ce que cela a changé pour nous

    La branche actuelle, celle sur laquelle nous démarrons les nouveaux sites quand leur code le permet.

Les années sont celles de la première sortie de chaque version, d'après l'historique officiel des versions du projet PHP.

Suivez une requête à travers le stack

Une page d'un site PHP traverse cinq couches à l'aller, et remonte par les cinq mêmes au retour. Nous nous occupons de chacune d'elles, et chacune a sa propre page.

  1. Le visiteur

    Un navigateur demande une page en HTTPS. Le certificat, le pare-feu et les règles placées devant le serveur décident d'abord si la requête a le droit d'entrer.

  2. Le serveur web

    Nginx ou LiteSpeed prend la connexion, sert lui-même les images et les fichiers, et ne transmet que le travail PHP au pool situé derrière.

  3. Le runtime PHP

    Des pools PHP-FPM, un par site, chacun sur la version de PHP dont son code a besoin, avec OPcache chaud et des workers dimensionnés pour le trafic.

  4. Votre code

    Un framework ou une plateforme prête à l'emploi transforme la requête en page : votre propre application Laravel, ou WordPress, Magento, Moodle et les autres.

  5. Les données

    MySQL ou MariaDB conserve les enregistrements, et Redis garde en mémoire ce qui est demandé encore et encore.

Sous les cinq

Le serveur lui-même

Nos propres serveurs, gérés par la même équipe, avec notre propre panneau de contrôle par-dessus.

Passer à un PHP plus récent sans mauvais réveil

Chaque site a son propre pool : un même serveur peut donc faire tourner plusieurs versions de PHP côte à côte, et chaque site migre quand son code est prêt, pas quand le serveur l'est.

  1. Nous listons ce que fait tourner chaque site

    Sa version de PHP, ses extensions, et les plugins ou paquets qui le retiennent.

  2. Une copie essaie la nouvelle version

    Le site est copié et exécuté sur la version suivante de PHP, et son journal d'erreurs est lu ligne par ligne.

  3. Nous corrigeons ce qui casse

    Les fonctions supprimées, les appels dépréciés et les plugins sans mise à jour sont corrigés ou remplacés.

  4. Un site à la fois

    Chaque site bascule seul vers son nouveau pool, et peut revenir en arrière immédiatement si quelque chose a été oublié.

php-fpmUn serveur, plusieurs versions
SitePHPPoolÉtat
shop.example.com 8.4 fpm-shop en ligne
blog.example.com 8.3 fpm-blog en ligne
crm.example.com 7.4 → 8.3 fpm-crm sur une copie
learn.example.com 8.3 fpm-learn en ligne
Un exemple de serveur

Confiez-nous votre PHP

Un ancien site qui a besoin d'un PHP plus récent, une plateforme à installer, ou un serveur pour faire tourner le tout. Chaque projet fait l'objet d'un devis après un court échange.