Deployer ist ein Open-Source-Deployment-Tool für PHP-Projekte – speziell entwickelt, um Anwendungen wie Laravel, Symfony, Magento, WordPress oder auch generische PHP-Apps automatisiert, wiederholbar und sicher auf Server zu bringen.
Es ist ein CLI-Tool, geschrieben in PHP.
Du definierst dein Deployment in einer deploy.php
-Datei mit klaren Aufgaben (Tasks).
Es setzt auf das Prinzip Zero Downtime Deployment, z. B. durch Symlinks.
Unterstützt mehrstufige Umgebungen (z. B. staging, production).
Du installierst Deployer über Composer:
composer require deployer/deployer --dev
Du generierst ein Template:
vendor/bin/dep init
Du konfigurierst deploy.php
, z. B. für Laravel:
host('mein-server.com')
->set('deploy_path', '/var/www/meinprojekt')
->set('branch', 'main');
task('deploy', [
'deploy:prepare',
'deploy:vendors',
'artisan:migrate',
'deploy:publish',
]);
Du startest das Deployment:
vendor/bin/dep deploy production
Deployer:
Verbindet sich via SSH mit dem Zielserver
Klont das Git-Repository in ein neues Release-Verzeichnis
Installiert Composer-Abhängigkeiten
Führt Tasks aus (z. B. php artisan migrate
)
Verlinkt das neue Release mit dem Live-Verzeichnis (current
)
Löscht alte Releases nach Bedarf
Vorteil | Beschreibung |
---|---|
🚀 Schnell & Skriptbar | Alles per CLI steuerbar |
🔁 Rollback-Funktion | Bei Fehlern einfach zum letzten funktionierenden Release zurück |
⚙️ Flexibel erweiterbar | Eigene Tasks, Hooks und Bedingungen |
🧩 Viele Presets | Für Laravel, Symfony, WordPress etc. |
🔐 Sicher durch SSH | Keine FTP-Abhängigkeit |
Laravel Octane ist eine offizielle Erweiterung für das Laravel-Framework, die die Performance deiner Anwendung dramatisch verbessert, indem sie Laravel auf Hochleistungsservern wie Swoole oder RoadRunner ausführt.
Statt bei jeder HTTP-Anfrage den Laravel-Framework-Code neu zu laden (wie bei PHP-FPM üblich), hält Octane deine Anwendung permanent im Speicher. Das spart Bootstrapping-Zeit und macht deine App viel schneller.
Laravel Octane nutzt Worker-basierte Server (z. B. Swoole oder RoadRunner), die:
Die Laravel-Anwendung einmalig booten,
Dann Anfragen wiederholt und schnell verarbeiten, ohne das Framework neu zu starten.
Vorteil | Beschreibung |
---|---|
⚡ Höhere Performance | Bis zu 10x schneller als klassische Laravel-Setups mit PHP-FPM |
🔁 Persistente Worker | Keine Neuinitalisierung bei jeder Anfrage |
🌐 WebSockets & Echtzeit | Direkte Unterstützung dank Swoole/RoadRunner |
🧵 Nebenläufigkeit | Möglichkeit zur parallelen Verarbeitung von Aufgaben |
🔧 Built-in Features | Task Worker, Route Watcher, Task Dispatching usw. |
RoadRunner ist ein High-Performance Application Server für PHP, der von Spiral Scout entwickelt wurde. Er ersetzt den klassischen PHP-FPM (FastCGI Process Manager) und bietet durch eine dauerhafte Ausführung deiner PHP-Anwendung einen massiven Performance-Schub – besonders bei Frameworks wie Laravel oder Symfony.
PHP-Skripte werden nicht bei jeder Anfrage neu geladen, sondern laufen dauerhaft in sogenannten Worker-Prozessen (ähnlich wie bei Node.js oder Swoole).
Dadurch sparst du dir das erneute Bootstrapping deiner App bei jedem Request – das ist wesentlich schneller als bei PHP-FPM.
RoadRunner selbst ist in der Programmiersprache Go geschrieben – das bedeutet hohe Stabilität, einfache Cross-Plattform-Deployments und parallele Verarbeitung von Anfragen.
HTTP-Server (inkl. HTTPS, Gzip, CORS, etc.)
PSR-7 & PSR-15 Middleware-Kompatibilität
Unterstützung für:
Hot Reload für Änderungen im Code (mit Watch-Modul)
RoadRunner startet PHP-Worker-Prozesse.
Die Worker laden einmal den gesamten Framework-Bootstrap.
RoadRunner verteilt HTTP- oder gRPC-Anfragen an die Worker.
Die Antwort wird über Go zurückgegeben – schnell und parallel.
Laravel + RoadRunner (statt Laravel + PHP-FPM)
Anwendungen mit hoher Request-Frequenz
APIs, Microservices, Echtzeit-Anwendungen (z. B. mit WebSockets)
Serverless-ähnliche Dienste, wo Latenz kritisch ist
Eigenschaft | PHP-FPM | RoadRunner |
---|---|---|
Bootstrapping pro Request | Ja | Nein (persistente Worker) |
Geschwindigkeit | Gut | Exzellent |
WebSockets | Nicht direkt | Ja |
gRPC | Nein | Ja |
Sprache | C | Go |
Ein Headless CMS (Content Management System) ist ein Content-Management-System, bei dem das Backend (die Inhalte und ihre Verwaltung) vom Frontend (der Darstellung für die Nutzer) vollständig getrennt ist.
Backend und Frontend sind gekoppelt.
Die Inhalte werden im System erstellt und direkt als HTML über ein fest integriertes Theme angezeigt.
Vorteil: Alles aus einer Hand.
Nachteil: Eingeschränkte Flexibilität, schwer für Multi-Plattform-Ausgabe (z. B. App + Webseite + Smartwatch).
Nur Backend.
Inhalte werden über eine API (z. B. REST oder GraphQL) bereitgestellt.
Das Frontend (z. B. eine React-Webseite, native App, Digital Signage) holt sich die Inhalte dynamisch.
Vorteil: Sehr flexibel, geeignet für Multi-Channel-Ausspielung.
Nachteil: Frontend muss separat entwickelt werden (mehr Aufwand).
Webseiten mit modernen JavaScript-Frameworks (z. B. React, Next.js, Vue)
Mobile Apps, die denselben Content wie die Website zeigen sollen
Omnichannel-Strategien: Website, App, IoT-Geräte, etc.
Contentful
Strapi
Sanity
Directus
Prismic
Storyblok (Hybrid-Ansatz mit Visual Editor)
Storyblok ist ein benutzerfreundliches, headless Content-Management-System (CMS), das Entwicklern und Marketing-Teams hilft, Inhalte schnell und effizient zu erstellen, zu verwalten und zu veröffentlichen. Es bietet eine visuelle Bearbeitungsoberfläche, die es ermöglicht, Inhalte in Echtzeit zu gestalten, und ist flexibel mit verschiedenen Frameworks und Plattformen kompatibel. Durch seine API-first-Architektur können Inhalte auf jeder digitalen Plattform ausgespielt werden, was es ideal für moderne Web- und App-Entwicklung macht.
Aspect-Oriented Programming (AOP) ist ein Programmierparadigma, das sich darauf konzentriert, Querschnittsfunktionen (Cross-Cutting Concerns) modular zu kapseln. Es ergänzt objektorientierte oder funktionale Programmierung, indem es Code, der sich durch viele Klassen oder Module zieht, auslagert und separat behandelt.
Probleme wie Logging, Sicherheitsprüfungen, Fehlerbehandlung, Transaktionsmanagement oder Performance-Messungen sind typische Cross-Cutting Concerns. Diese wiederholen sich oft in vielen Klassen und Methoden – AOP ermöglicht es, solchen Code zentral zu schreiben und automatisch an den richtigen Stellen auszuführen.
Aspect: Ein Modul, das eine Querschnittsfunktion kapselt.
Advice: Der eigentliche Code, der ausgeführt wird (z. B. vor, nach oder anstatt einer Methode).
Join Point: Ein Punkt im Programmablauf, an dem ein Aspect eingreifen kann (z. B. Methodenaufruf).
Pointcut: Eine Definition, welche Join Points betroffen sind (z. B. "alle Methoden in Klasse X").
Weaving: Der Prozess, bei dem Aspect-Code mit dem eigentlichen Code „verwoben“ wird – zur Laufzeit, beim Kompilieren oder beim Laden.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Methode wird aufgerufen: " + joinPoint.getSignature().getName());
}
}
Dieser Code führt automatisch Logging aus, bevor jede Methode im com.example.service
-Paket ausgeführt wird.
Bessere Modularität
Weniger Code-Duplikate
Trennung von Fachlogik und Querschnittslogik
Kann die Lesbarkeit erschweren (man sieht nicht sofort, was alles beim Methodenaufruf passiert).
Debugging kann komplexer sein.
Oft framework-abhängig (z. B. Spring, AspectJ).
Design by Contract (DbC) ist ein Konzept aus der Softwareentwicklung, das von Bertrand Meyer eingeführt wurde. Es beschreibt eine Methode zur Sicherstellung der Korrektheit und Zuverlässigkeit von Software, indem Verträge zwischen den verschiedenen Komponenten (z.B. Methoden, Klassen) definiert werden.
Bei DbC wird jede Software-Komponente wie eine Vertragspartei gesehen, die bestimmte Verpflichtungen und Garantien einhält:
Vorbedingungen (Preconditions)
Bedingungen, die erfüllt sein müssen, bevor eine Methode oder Funktion korrekt ausgeführt werden kann.
→ Verantwortung des Aufrufers.
Nachbedingungen (Postconditions)
Bedingungen, die nach der Ausführung garantiert werden.
→ Verantwortung der Methode/Funktion.
Invariant (Klasseninvariante)
Bedingungen, die während der gesamten Lebenszeit eines Objekts wahr bleiben müssen.
→ Verantwortung sowohl der Methode als auch des Aufrufers.
Klare Spezifikation der Verantwortlichkeiten.
Robustere und besser testbare Software.
Fehler werden frühzeitig erkannt (z.B. durch Verletzung des Vertrags).
class BankAccount {
private double balance;
// Invariante: balance >= 0
void withdraw(double amount) {
// Vorbedingung: amount > 0 && amount <= balance
if (amount <= 0 || amount > balance) throw new IllegalArgumentException();
balance -= amount;
// Nachbedingung: balance wurde um amount verringert
}
}
Klare Verträge führen zu weniger Missverständnissen.
Bessere Fehlersuche, da Verstöße gegen Verträge sofort auffallen.
Unterstützt die defensive Programmierung.
Erhöhter Aufwand in der Spezifikation.
Nicht von allen Programmiersprachen direkt unterstützt (z.B. Java, C++ über Assertions, Python mit Decorators; Eiffel unterstützt DbC nativ).
Ein Daemon (ausgesprochen wie „dä-mon“, nicht wie das englische „demon“) ist ein Hintergrundprozess, der auf einem Computersystem läuft – meist ohne direkte Benutzerinteraktion.
Startet automatisch beim Hochfahren des Systems.
Läuft dauerhaft im Hintergrund.
Erledigt Aufgaben, ohne dass der Benutzer direkt mit ihm arbeitet.
Hört auf Anforderungen von anderen Programmen oder Netzwerken.
cron
-Daemon: Führt zeitgesteuerte Aufgaben aus (z. B. tägliche Backups).
sshd
: Behandelt SSH-Verbindungen von außen.
httpd
oder nginx
: Webserver-Dienste.
cupsd
: Druckaufträge verwalten.
In Unix/Linux endet ein Daemon-Prozessname oft mit „d“ (z. B. httpd
, systemd
).
Ein Daemon wird oft beim Systemstart durch Init-Systeme wie systemd
oder init
gestartet.
Der Begriff stammt aus der griechischen Mythologie, wo „Daimon“ eine Art Geist oder übernatürliches Wesen war, das im Hintergrund wirkte – passend zur Funktion im Betriebssystem.
Der "Happy Path" (auch "Happy Flow" genannt) bezeichnet in der Softwareentwicklung oder im Testing den idealen Ablauf eines Prozesses oder Programms, bei dem alles wie geplant funktioniert, keine Fehler auftreten und alle Eingaben gültig sind.
Wenn du z. B. ein Online-Formular zur Registrierung entwickelst, sieht der Happy Path so aus:
Der Benutzer gibt alle Daten korrekt ein (z. B. gültige E-Mail, sicheres Passwort).
Er klickt auf „Registrieren“.
Das System erstellt erfolgreich einen Account.
Der Benutzer wird zur Willkommensseite weitergeleitet.
➡️ Keine Validierungsfehler, keine Serverprobleme, kein unerwartetes Verhalten.
Erstes Testziel: Beim Entwickeln oder Testen schaut man sich oft zuerst den Happy Path an, um sicherzugehen, dass das Grundgerüst funktioniert.
Basis für Use Cases: In der Dokumentation von Anforderungen oder Prozessen ist der Happy Path oft der zentrale Anwendungsfall, bevor man Sonderfälle beschreibt.
Abgrenzung zu Edge Cases / Error Paths: Alles, was vom Happy Path abweicht (z. B. leeres Passwortfeld, Serverfehler), gehört zu den „unhappy paths“ oder „alternate flows“.
In der Softwareentwicklung bezeichnet ein Guard (auch Guard Clause oder Guard Statement) eine Art von Schutzmechanismus innerhalb einer Funktion oder Methode, der sicherstellt, dass bestimmte Bedingungen erfüllt sind, bevor der restliche Code ausgeführt wird.
Ein Guard ist wie ein Türsteher: Er lässt nur das durch, was erlaubt ist – und alles andere wird frühzeitig beendet.
def divide(a, b):
if b == 0:
return "Division durch null nicht erlaubt" # Guard Clause
return a / b
In diesem Beispiel schützt der Guard davor, dass eine Division durch null passiert.
Frühes Beenden bei ungültigen Zuständen
Verbesserte Lesbarkeit durch weniger verschachtelte if-else-Strukturen
Saubererer Codefluss, da der "Happy Path" (also der normale Ablauf) nicht durch viele Sonderfälle unterbrochen wird
function login(user) {
if (!user) return; // Guard
// Weiter mit Login-Logik
}
Swift (hat sogar ein eigenes Schlüsselwort guard
):
func greet(person: String?) {
guard let name = person else {
print("Kein Name übergeben")
return
}
print("Hallo, \(name)!")
}