PHP bei EGPHP

Alles, was wir bauen, beginnt mit PHP.

Unser Team schreibt und betreibt PHP seit fünfundzwanzig Jahren, seit PHP 4. Die Server, das Control Panel und die Websites, die wir betreuen, fangen alle hier an.

Fünfundzwanzig Jahre, Version für Version

Wir kennen diese Versionen nicht aus der Lektüre. Wir haben echte Websites durch jede einzelne davon gebracht, und jede Zeile unten ist eine Änderung, mit der wir auf einem Live-Server umgehen mussten.

  1. PHP 4 2000

    Sessions und Ausgabepufferung, direkt eingebaut

    Die Zend Engine kam, und Sessions sowie Ausgabepufferung wurden Teil der Sprache statt Zusatzmodule. Eine ganze Generation früher dynamischer Websites wurde darauf geschrieben.

    • Zend Engine
    • session_start()
    • ob_start()
    Was es für uns bedeutete

    Hier hat unser Team angefangen: handgeschriebene Websites auf Shared-Servern, noch mit aktiviertem register_globals.

  2. PHP 5.0 2004

    Ein echtes Objektmodell

    Die Zend Engine 2 brachte Klassen mit Sichtbarkeiten, Interfaces und Exceptions, Objekte, die per Handle übergeben statt kopiert werden, sowie die Erweiterungen MySQLi und SimpleXML.

    • private
    • interface
    • try / catch
    • mysqli
    Was es für uns bedeutete

    Code ließ sich in Klassen gliedern, die ein ganzes Team gemeinsam nutzt, und die Datenbank bekam einen modernen Treiber.

  3. PHP 5.3 2009

    Namespaces und Closures

    Namespaces, anonyme Funktionen und Late Static Binding: das Fundament, auf dem später Composer und das gemeinsame Paket-Ökosystem entstanden.

    • namespace
    • function () use ()
    • static::
    Was es für uns bedeutete

    Bibliotheken verschiedener Autoren konnten endlich in einem Projekt nebeneinander bestehen, ohne dass ihre Namen kollidierten.

  4. PHP 5.4 2012

    Traits, kurze Arrays und Aufräumarbeiten Brach alten Code

    Traits, die kurze Array-Syntax [] und ein eingebauter Entwicklungsserver, während register_globals, Magic Quotes und der Safe Mode endgültig entfernt wurden.

    • trait
    • [ ]
    • php -S
    Was es für uns bedeutete

    Alte Websites, die auf register_globals angewiesen waren, funktionierten nicht mehr, und ein Upgrade hieß, sie zuerst zu reparieren.

  5. PHP 5.5 2013

    OPcache direkt mitgeliefert

    OPcache wurde mit PHP selbst ausgeliefert und hielt kompilierte Skripte im Arbeitsspeicher, dazu kamen Generatoren und password_hash().

    • opcache
    • yield
    • password_hash()
    Was es für uns bedeutete

    Kompilierter Code bleibt im Arbeitsspeicher, statt bei jeder Anfrage neu gelesen zu werden. Es ist bis heute die erste Einstellung, die wir auf jedem PHP-Server prüfen.

  6. PHP 6 nie erschienen

    Die Version, die nie erschien

    PHP 6 war um native Unicode-Strings herum geplant und wurde aufgegeben. Die nächste Version erhielt die Nummer 7, damit sie nicht mit den Büchern und Plänen verwechselt wurde, die für 6 geschrieben worden waren.

  7. PHP 7.0 2015

    Der Geschwindigkeitssprung Brach alten Code

    Eine neu aufgebaute Engine, die laut PHP-Projekt bis zu doppelt so schnell war wie 5.6 und dabei weniger Speicher brauchte, dazu skalare Typ- und Rückgabetyp-Deklarationen, ?? und <=>.

    • int $id
    • : string
    • ??
    • <=>
    Was es für uns bedeutete

    Die alten Funktionen mysql_* wurden entfernt – ein häufiger Grund, warum eine alte Website bei diesem Upgrade nicht mehr lief.

  8. PHP 7.4 2019

    Typisierte Properties und Preloading

    Typisierte Properties, Arrow Functions, der Operator ??=, OPcache-Preloading und FFI.

    • public int $id
    • fn ($x) =>
    • ??=
    Was es für uns bedeutete

    Die letzte 7.x-Version und diejenige, auf der viele ältere Anwendungen am längsten blieben – deshalb holen wir bis heute Websites von ihr herunter.

  9. PHP 8.0 2020

    JIT, Attribute und benannte Argumente Brach alten Code

    Ein JIT-Compiler, Attribute, benannte Argumente, Union Types, match, der Nullsafe-Operator ?-> und Constructor Property Promotion.

    • #[Attribute]
    • match
    • ?->
    • JIT
    Was es für uns bedeutete

    Viele Warnungen wurden zu Fehlern, und Vergleiche zwischen Strings und Zahlen änderten sich – Code, der unter 7.4 unauffällig lief, konnte unter 8.0 abbrechen.

  10. PHP 8.1 2021

    Enums, readonly und Fibers

    Native Enums, readonly-Properties, Fibers, der Rückgabetyp never und die First-Class-Callable-Syntax.

    • enum
    • readonly
    • Fiber
    • never
    Was es für uns bedeutete

    Fibers ebneten den Weg für asynchrone PHP-Bibliotheken, ohne zu ändern, wie eine gewöhnliche Anfrage abläuft.

  11. PHP 8.2 2022

    Readonly-Klassen und eine Warnung für alten Code

    Readonly-Klassen, DNF-Typen, true, false und null als eigenständige Typen sowie eine neue Random-Erweiterung.

    • readonly class
    • (A&B)|null
    • Random\Randomizer
    Was es für uns bedeutete

    Dynamische Properties wurden als veraltet markiert, und ältere Plugins füllten die Logs mit Hinweisen, bis sie aktualisiert wurden.

  12. PHP 8.3 2023

    Typisierte Konstanten und #[\Override]

    Typisierte Klassenkonstanten, das Attribut #[\Override], json_validate() und der dynamische Abruf von Klassenkonstanten.

    • const string
    • #[\Override]
    • json_validate()
    Was es für uns bedeutete

    Ein ruhigeres Release – und damit ein leichter Schritt für Websites, die bereits auf 8.2 laufen.

  13. PHP 8.4 2024

    Property Hooks

    Property Hooks, asymmetrische Sichtbarkeit, Lazy Objects, ein HTML5-fähiger DOM-Parser und new MyClass()->method() ohne die zusätzlichen Klammern.

    • get { }
    • public private(set)
    • Dom\HTMLDocument
    Was es für uns bedeutete

    Getter und Setter, die früher jeweils eine eigene Methode brauchten, gehören jetzt zur Property selbst – so gibt es weniger Code zu pflegen.

  14. PHP 8.5 2025

    Der Pipe-Operator Aktuell

    Der Pipe-Operator |>, eine eingebaute URI-Erweiterung, clone with, das Attribut #[\NoDiscard], array_first() und array_last() sowie ein Backtrace bei fatalen Fehlern.

    • |>
    • Uri\Rfc3986\Uri
    • clone($o, [ ])
    Was es für uns bedeutete

    Die aktuelle Release-Linie und die, mit der wir neue Websites starten, wenn ihr Code es unterstützt.

Die Jahreszahlen entsprechen der jeweils ersten Veröffentlichung laut der eigenen Release-Historie des PHP-Projekts.

Folgen Sie einer Anfrage durch den Stack

Eine Seite einer PHP-Website durchläuft auf dem Hinweg fünf Schichten und auf dem Rückweg dieselben fünf wieder nach oben. Wir kümmern uns um jede davon, und jede hat ihre eigene Seite.

  1. Der Besucher

    Ein Browser fordert eine Seite über HTTPS an. Das Zertifikat, die Firewall und die Regeln vor dem Server entscheiden, ob die Anfrage überhaupt hereingelassen wird.

  2. Der Webserver

    Nginx oder LiteSpeed nimmt die Verbindung an, liefert Bilder und Dateien selbst aus und reicht nur die PHP-Arbeit an den Pool dahinter weiter.

  3. Die PHP-Laufzeit

    PHP-FPM-Pools, einer pro Website, jeder mit der PHP-Version, die sein Code braucht, mit warmem OPcache und Workern, die auf den Traffic ausgelegt sind.

  4. Ihr Code

    Ein Framework oder eine fertige Plattform macht aus der Anfrage eine Seite: Ihre eigene Laravel-Anwendung oder WordPress, Magento, Moodle und die übrigen.

  5. Die Daten

    MySQL oder MariaDB speichert die Datensätze, und Redis hält im Arbeitsspeicher, was immer wieder abgefragt wird.

Unter allen fünf

Der Server selbst

Unsere eigenen Server, betrieben vom selben Team, mit unserem eigenen Control Panel darüber.

Auf ein neueres PHP umsteigen – ohne böses Erwachen

Jede Website bekommt ihren eigenen Pool, sodass ein Server mehrere PHP-Versionen nebeneinander betreiben kann und jede Website umzieht, wenn ihr Code bereit ist, nicht wenn der Server es ist.

  1. Wir erfassen, was jede Website nutzt

    Ihre PHP-Version, ihre Erweiterungen und die Plugins oder Pakete, die sie zurückhalten.

  2. Eine Kopie testet die neue Version

    Die Website wird kopiert und mit der nächsten PHP-Version betrieben, und ihr Fehlerprotokoll wird Zeile für Zeile gelesen.

  3. Wir beheben, was kaputtgeht

    Entfernte Funktionen, veraltete Aufrufe und Plugins ohne Update werden repariert oder ersetzt.

  4. Eine Website nach der anderen

    Jede Website wechselt einzeln in ihren neuen Pool und kann sofort zurückgeschaltet werden, falls etwas übersehen wurde.

php-fpmEin Server, mehrere Versionen
WebsitePHPPoolStatus
shop.example.com 8.4 fpm-shop live
blog.example.com 8.3 fpm-blog live
crm.example.com 7.4 → 8.3 fpm-crm auf Kopie
learn.example.com 8.3 fpm-learn live
Ein Beispielserver

Bringen Sie uns Ihr PHP

Eine alte Website, die ein neueres PHP braucht, eine Plattform, die installiert werden soll, oder ein Server, auf dem alles läuft. Jeder Auftrag wird nach einem kurzen Gespräch angeboten.