Dependency Injection ist kein Framework-Feature. Es ist ein Prinzip: Abhängigkeiten werden von außen übergeben statt innen erzeugt. Das macht Code testbar, austauschbar und verständlich — ohne Container, ohne Reflection-Magie. Das Problem Nicht testbar. Nicht konfigurierbar. Nicht austauschbar. Cons…
ist PHP's Interface zur Unix-Prozessverwaltung. Für Daemon-Prozesse, parallele Verarbeitung in CLI-Scripts und sauberes Signal-Handling unverzichtbar. Voraussetzung ist nur in CLI verfügbar, nicht in FPM oder Apache-Modulen. Signal-Handling Signale sind Nachrichten an laufende Prozesse. SIGTERM ist …
PHP im CLI-Modus ist praktisch für Wartungsscripts, Imports und Cronjobs. Mit ein bisschen ANSI-Code wird die Ausgabe übersichtlicher. Farben Verwendung Einfache Fortschrittsanzeige überschreibt die aktuelle Zeile statt eine neue anzufangen. Eingabe vom Benutzer lesen Terminal-Breite
ist ein Anfang. Wer eine eigene Exception-Hierarchie hat kann Fehler gezielt abfangen, präzise reagieren und seinen Code verständlicher machen. Das Problem mit einer einzigen Exception-Klasse Eine sinnvolle Hierarchie Exceptions mit Kontext anreichern HTTP-Exception für Web-Anwendungen Globaler Exce…
PHP ist traditionell synchron. Ein Request, ein Ausführungspfad, fertig. Mit PHP 8.1 kamen Fibers — eine Möglichkeit für kooperative Nebenläufigkeit ohne Threads. Was Fibers sind Fibers sind keine Threads. Es läuft kein Code wirklich parallel. Eine Fiber kann die Kontrolle freiwillig abgeben () und …
Für zeitaufwendige Aufgaben wie Mails verschicken, Bilder verarbeiten oder externe APIs ansprechen braucht man eine Queue. Redis oder RabbitMQ sind die übliche Wahl — aber für kleinere Projekte reicht eine einfache Datenbankimplementierung. Tabelle anlegen Job einreihen Worker Als Cronjob laufen las…
Redis ist einer der nützlichsten Dienste im Stack. Schnell, einfach zu betreiben und für viele Anwendungsfälle geeignet: Sessions, Caching, Rate-Limiting, einfache Queues. Installation Sessions in Redis Sofort skalierbar auf mehrere Server. Sessions liegen nicht mehr auf Disk. Caching Cache invalidi…
PHP 8.1 hat zwei Features gebracht die den Alltag spürbar verbessern: Enums und Readonly Properties. Beide machen Code präziser und sicherer. Enums Vorher: Konstanten in einer Klasse die man vergessen kann zu prüfen. Mit Enum: Enum-Methoden Backed Enum aus DB-Wert Readonly Properties Readonly bedeut…
Webhooks sind HTTP-Callbacks die ein Dienst aufruft wenn etwas passiert. GitHub schickt einen beim Push, Stripe bei einer Zahlung, Telegram bei einer Nachricht. Das Empfangen ist einfach, die Signatur zu prüfen ist wichtig. Grundstruktur GitHub-Signatur prüfen GitHub signiert jeden Webhook mit einem…
PHP hat seit Version 7 ein immer stärkeres Type System bekommen. Wer es ignoriert verschenkt Sicherheit die der Compiler einem schenkt — ohne Laufzeit-Overhead. Union Types (PHP 8.0) Eine Variable oder Parameter kann einen von mehreren Typen haben: Sinnvoll, aber sparsam verwenden. Wenn man zu oft s…
cURL ist in PHP der Standardweg um HTTP-Requests abzusetzen. Die rohe cURL-API ist aber umständlich. Eine kleine Wrapper-Funktion macht das deutlich angenehmer. GET-Request POST mit JSON Mit Bearer Token Für einfache API-Integrationen reicht das vollständig aus. Wer komplexere Anforderungen hat etwa…
Output Buffering ist einer der weniger bekannten PHP-Mechanismen aber er ist praktischer als man denkt. Was es ist Normalerweise sendet PHP die Ausgabe sofort zum Browser. Mit Output Buffering wird sie zuerst in einem Puffer gesammelt und erst dann gesendet wenn man es sagt. Grundlegende Verwendung …
PHP-Scripts im Browser aufzurufen und als Cronjob zu betreiben sind zwei verschiedene Paar Schuhe. Im CLI-Modus gibt es kein HTTP, keine Session, keine $_GET-Parameter und andere Timeouts. Einfachster Weg: php-cli direkt aufrufen Absoluter Pfad zu php und zum Script, Ausgabe ins Log umleiten. Im Scr…
Klassen in PHP sind nicht immer die richtige Wahl — für viele Scripts reichen Funktionen. Sobald man aber zusammenhängende Daten und Logik hat die man wiederverwenden will macht OOP Sinn. Einfache Klasse Verwendung Wann Klassen, wann Funktionen Funktionen wenn es eine abgeschlossene Operation ist di…
Datei-Uploads sind eine häufige Schwachstelle wenn man nicht aufpasst. Wer einfach alles akzeptiert was reinkommt öffnet Tür und Tor für ausführbare Dateien, riesige Uploads und andere Probleme. Grundstruktur Aufruf Upload-Verzeichnis absichern Das Upload-Verzeichnis sollte keine PHP-Ausführung erla…
Wer noch nie Tests geschrieben hat fängt oft nicht an weil er denkt er braucht erst ein Framework, eine Ordnerstruktur, einen Test-Runner. Man braucht nichts davon für den Anfang. Das Prinzip Ein Test führt Code aus und prüft ob das Ergebnis stimmt. Das ist ein Test-Runner. Simpel, direkt, ohne Abhä…
PHP Sessions sind standardmäßig nicht besonders sicher konfiguriert. Mit ein paar ini_set-Aufrufen am Anfang jeder Anfrage lässt sich das schnell ändern. Grundlegende Absicherung Diese Einstellungen vor setzen. verhindert dass JavaScript die Session-Cookie auslesen kann. schützt gegen CSRF über den …
Die eingebaute -Funktion von PHP ist auf den meisten Systemen unzuverlässig und landet oft im Spam. Wer Mails direkt über einen SMTP-Server verschickt hat deutlich mehr Kontrolle. Ohne externe Bibliothek geht das über Sockets — hier eine einfache Funktion die für den Alltag reicht. Verwendung Für HT…
Cross-Site Request Forgery bedeutet dass eine fremde Seite im Hintergrund Requests an deine Anwendung schickt während ein eingeloggter Nutzer diese Seite besucht. Der Browser schickt dabei automatisch die Session-Cookie mit. Der Schutz dagegen ist ein zufälliges Token das nur die eigene Seite kennt.…
PHP-FPM ist das Interface zwischen Nginx und PHP. Wer es mit Standardeinstellungen betreibt verschenkt entweder Ressourcen oder läuft in Limits die sich wie ein Hänger anfühlen. Pool-Konfiguration Unix Socket statt TCP () — weniger Overhead, ausreichend für lokales Nginx. Process Manager: dynamic vs…
Traits sind ein Werkzeug für Wiederverwendung von Code in Klassen die keine gemeinsame Vererbungshierarchie teilen. Sie lösen ein echtes Problem — aber sie werden gern überstrapaziert. Das Problem das Traits lösen PHP unterstützt keine Mehrfachvererbung. Wenn zwei verschiedene Klassen dieselbe Hilfs…
Wer in PHP noch mit oder ungesicherten Abfragen arbeitet sollte das dringend ändern. PDO ist der richtige Weg und mit Prepared Statements sind SQL-Injections kein Thema mehr. Verbindung aufbauen ist wichtig damit Fehler als Exception geworfen werden und nicht still scheitern. sorgt dafür dass echte …
MD5 und SHA1 haben in Passwort-Hashing nichts verloren. Beides ist viel zu schnell und damit für Brute-Force-Angriffe anfällig. PHP hat seit Jahren die richtigen Funktionen eingebaut. passwordhash und passwordverify Passwort beim Registrieren hashen. Den Hash in der Datenbank speichern, niemals das …
Für die meisten Projekte braucht man keine fertige Logging-Bibliothek. Eine einfache Logger-Klasse ist in wenigen Minuten gebaut und tut genau das was man braucht. Verwendung Ausgabe im Log Kontext mitloggen Wer täglich rotierende Log-Dateien braucht gibt einfach in den Dateinamen mit.
PHP kompiliert bei jedem Request jede Datei von Grund auf neu zu Bytecode — sofern OPcache nicht aktiv ist. Mit OPcache passiert das einmal, danach wird der Bytecode aus dem Speicher gelesen. Der Unterschied ist erheblich. Ob OPcache aktiv ist prüfen Konfiguration Das wichtigste Setting für Produkti…
PHP hat standardmäßig eine ziemlich rudimentäre Fehlerbehandlung. Mit einem eigenen Handler hat man die volle Kontrolle darüber was mit Fehlern passiert. Eigener Error Handler Exception Handler Uncatched Exceptions die durchrutschen. Shutdown Handler für fatale Fehler Fatale Fehler werden von nicht …
Composer ist für viele Projekte sinnvoll aber nicht für jedes. Wer ein schlankes PHP-Projekt ohne externe Abhängigkeiten baut braucht keinen Composer nur um Klassen automatisch zu laden. splautoloadregister PHP ruft diese Funktion auf wenn eine Klasse benötigt wird die noch nicht geladen ist. Aus de…
Manchmal braucht man einen einfachen Rate-Limiter um Formular-Spam oder zu viele Anfragen zu drosseln, ohne dafür Redis oder eine Datenbank aufzusetzen. Das geht auch mit einer einfachen Textdatei. Die Funktion gibt zurück wenn die Anfrage erlaubt ist, wenn das Limit erreicht wurde. Beispiel: maxima…
In wenigen Schritten lässt sich SSH gegen die meißten Angriffe absichern. Hier mal eine kleine Auflistung der grundlegenden Dingen die man einfach umsetzen kann und die demnoch wirkungsvoll sind. Root Login verbieten Loginversuche mitloggen und ggf. IP sperren (Bruteforce) Sofern noch nicht vorhande…