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.
-
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 Enginesession_start()ob_start()
Was es für uns bedeuteteHier hat unser Team angefangen: handgeschriebene Websites auf Shared-Servern, noch mit aktiviertem register_globals.
-
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.
privateinterfacetry / catchmysqli
Was es für uns bedeuteteCode ließ sich in Klassen gliedern, die ein ganzes Team gemeinsam nutzt, und die Datenbank bekam einen modernen Treiber.
-
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.
namespacefunction () use ()static::
Was es für uns bedeuteteBibliotheken verschiedener Autoren konnten endlich in einem Projekt nebeneinander bestehen, ohne dass ihre Namen kollidierten.
-
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 bedeuteteAlte Websites, die auf register_globals angewiesen waren, funktionierten nicht mehr, und ein Upgrade hieß, sie zuerst zu reparieren.
-
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().
opcacheyieldpassword_hash()
Was es für uns bedeuteteKompilierter 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.
-
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.
-
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 bedeuteteDie alten Funktionen mysql_* wurden entfernt – ein häufiger Grund, warum eine alte Website bei diesem Upgrade nicht mehr lief.
-
PHP 7.4 2019
Typisierte Properties und Preloading
Typisierte Properties, Arrow Functions, der Operator ??=, OPcache-Preloading und FFI.
public int $idfn ($x) =>??=
Was es für uns bedeuteteDie letzte 7.x-Version und diejenige, auf der viele ältere Anwendungen am längsten blieben – deshalb holen wir bis heute Websites von ihr herunter.
-
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 bedeuteteViele 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.
-
PHP 8.1 2021
Enums, readonly und Fibers
Native Enums, readonly-Properties, Fibers, der Rückgabetyp never und die First-Class-Callable-Syntax.
enumreadonlyFibernever
Was es für uns bedeuteteFibers ebneten den Weg für asynchrone PHP-Bibliotheken, ohne zu ändern, wie eine gewöhnliche Anfrage abläuft.
-
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)|nullRandom\Randomizer
Was es für uns bedeuteteDynamische Properties wurden als veraltet markiert, und ältere Plugins füllten die Logs mit Hinweisen, bis sie aktualisiert wurden.
-
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 bedeuteteEin ruhigeres Release – und damit ein leichter Schritt für Websites, die bereits auf 8.2 laufen.
-
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 bedeuteteGetter und Setter, die früher jeweils eine eigene Methode brauchten, gehören jetzt zur Property selbst – so gibt es weniger Code zu pflegen.
-
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\Uriclone($o, [ ])
Was es für uns bedeuteteDie 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.
-
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.
-
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.
-
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.
-
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.
-
Die Daten
MySQL oder MariaDB speichert die Datensätze, und Redis hält im Arbeitsspeicher, was immer wieder abgefragt wird.
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.
Wir erfassen, was jede Website nutzt
Ihre PHP-Version, ihre Erweiterungen und die Plugins oder Pakete, die sie zurückhalten.
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.
Wir beheben, was kaputtgeht
Entfernte Funktionen, veraltete Aufrufe und Plugins ohne Update werden repariert oder ersetzt.
Eine Website nach der anderen
Jede Website wechselt einzeln in ihren neuen Pool und kann sofort zurückgeschaltet werden, falls etwas übersehen wurde.
| Website | PHP | Pool | Status |
|---|---|---|---|
| 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 |

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.