Information!

Laravel Best Practices: env() vs. config() im Vergleich

22. August 2024

Veröffentlicht in:

Webentwicklung

In Laravel gibt es eine klare Empfehlung, Umgebungsvariablen env() ausschließlich in Konfigurationsdateien zu verwenden. Doch immer wieder sieht man Code, in dem env() direkt in Anwendungslogik oder Controller-Funktionen verwendet wird. Dies kann schwerwiegende Auswirkungen auf die Performance und Stabilität der Anwendung haben, insbesondere in Produktionsumgebungen.

In diesem Artikel werde ich auf die Probleme eingehen, die durch die direkte Verwendung von env() entstehen können, und erläutern, warum die Verwendung des config()-Helpers in Laravel der bessere Ansatz ist.

Problem 1: Caching und env()

Eines der größten Probleme mit der direkten Verwendung von env() in der Anwendungslogik ist das Caching der Konfiguration. Wenn Laravel's Befehl php artisan config:cache ausgeführt wird, wird die gesamte Konfiguration in eine einzige Datei zwischengespeichert, um die Performance zu optimieren. Dies hat jedoch zur Folge, dass env()-Aufrufe außerhalb von Konfigurationsdateien nicht mehr funktionieren. Sobald die Konfiguration zwischengespeichert wurde, greift Laravel nicht mehr auf die .env-Datei zu, sondern verwendet die gecachte Konfiguration.

Das bedeutet, dass env()-Aufrufe in deinem Code zur Laufzeit keine korrekten Werte mehr zurückliefern. Dies kann zu unvorhersehbaren Fehlern in der Produktionsumgebung führen, während es in der Entwicklungsumgebung scheinbar funktioniert. Dieses Verhalten ist besonders gefährlich, weil es Entwickler oft in falscher Sicherheit wiegt.

Hier ist ein typisches Szenario:

  • In der Entwicklung funktioniert der Code, weil php artisan config:cache nicht verwendet wird.
  • In der Produktion führt dasselbe Skript zu Fehlern, weil die Umgebungsvariablen nicht mehr korrekt gelesen werden können.

Problem 2: IO-Load und Performance-Einbußen

Ein weiterer Aspekt, der häufig übersehen wird, ist die Performance-Auswirkung durch die häufige Nutzung von env(). Jedes Mal, wenn env() aufgerufen wird, muss die Anwendung auf das Dateisystem zugreifen, um die Variable aus der .env-Datei auszulesen. Dieser zusätzliche Input/Output-Overhead kann sich summieren und die Anwendungsleistung beeinträchtigen, insbesondere bei Anwendungen mit hohem Datenverkehr.

Stattdessen verwendet Laravel den config()-Helper, der die Werte aus den Konfigurationsdateien liest. Diese Werte werden im Speicher gehalten und sind somit wesentlich schneller zugänglich, ohne dass das Dateisystem ständig belastet wird.

Problem 3: Einschränkungen von Umgebungsvariablen

Umgebungsvariablen haben eine Reihe von Einschränkungen, die ihre Verwendung in komplexeren Szenarien problematisch machen:

  1. Keine Struktur: Umgebungsvariablen sind immer Strings. Du kannst keine komplexen Datenstrukturen wie Arrays oder Objekte direkt speichern. Wenn du also Datenstrukturen benötigst, musst du sie als Strings serialisieren und dann in deinem Code wieder deserialisieren, was zusätzliche Komplexität und Fehlerquellen mit sich bringt.

  2. Sichtbarkeit und Wartbarkeit: Umgebungsvariablen sind systemweit verfügbar, was zu Kollisionen zwischen verschiedenen Anwendungen führen kann. Es ist oft schwer nachzuvollziehen, welche Variablen von welcher Anwendung verwendet werden. In Konfigurationsdateien hingegen sind alle Einstellungen zentral und strukturiert abgelegt.

  3. Fehlende Dokumentation und Standardwerte: In einer .env-Datei sind Standardwerte nicht immer klar ersichtlich, und es kann passieren, dass Entwickler vergessen, wichtige Umgebungsvariablen zu definieren. Durch die Verwendung von Konfigurationsdateien kannst du Standardwerte definieren und sicherstellen, dass die Anwendung auch ohne vollständige .env-Datei funktioniert.

Best Practices: Verwendung von Konfigurationsdateien

Die empfohlene Vorgehensweise in Laravel ist die Verwendung von Konfigurationsdateien in Kombination mit dem config()-Helper. Anstatt also env() direkt in deiner Anwendungslogik aufzurufen, solltest du deine eigenen Konfigurationsdateien erstellen und dort auf env() zugreifen. Hier ist ein Beispiel:

// config/myconfig.php
return [
    'myvalue' => env('MY_VALUE', 'default_value'), // 'default_value' ist der Standardwert, falls die Variable in der .env-Datei fehlt
];

// Zugriff in deiner Anwendungslogik:
$value = config('myconfig.myvalue');

Durch diese Methode stellst du sicher, dass alle Umgebungsvariablen an einem zentralen Ort definiert sind und du von den Vorteilen des Config-Caching profitierst.

Fazit

Die direkte Verwendung von env() in deiner Laravel-Anwendung ist eine schlechte Praxis, die zu schwerwiegenden Problemen in Produktionsumgebungen führen kann. Sie verursacht nicht nur Performance-Probleme durch zusätzliche IO-Last, sondern kann auch dazu führen, dass deine Anwendung nach einem config:cache-Befehl nicht mehr richtig funktioniert.

Stattdessen solltest du Umgebungsvariablen nur in Konfigurationsdateien verwenden und in deiner Anwendungslogik auf den config()-Helper zurückgreifen. Das verbessert nicht nur die Performance, sondern macht deine Anwendung auch robuster und wartbarer.

Denke daran: Konfigurationsdateien sind dein Freund – env() ist es nicht.

Können wir weiterhelfen?

Sie haben ein spannendes Projekt und möchten mit uns zusammenarbeiten? Kontaktieren Sie uns jetzt!

Kostenloses Erstgespräch