NOW() in PHP: Optimierung und Performance bei Datum und Zeit

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

NOW() in PHP: Die Wahrheit über Zeit, die du noch nicht kanntest

\n\n

Jeder PHP-Entwickler hat mindestens einmal einen SQL-Query wie INSERT INTO logs (created_at) VALUES (NOW()) geschrieben. Und das funktioniert einwandfrei. Aber was, wenn ich dir sage, dass die Verwendung der MySQL-Funktion NOW() in jedem Query nicht immer optimal ist? Was, wenn dein Projekt Millionen von Anfragen verarbeitet? Oder du eine einheitliche Zeit für ein ganzes Skript benötigst?

\n\n

In diesem Artikel zeigen wir dir, wie du die NOW()-Funktion in PHP emulieren, die Performance deiner Anwendungen steigern und typische Fehler im Umgang mit Zeit vermeiden kannst. Du erfährst, wann PHP als NOW()-Alternative schneller ist als ein Datenbankzugriff und welche Fallstricke bei Zeitzonen lauern.

\n\n
\n\n

1. Was ist NOW() und warum sollte man es in PHP emulieren?

\n\n

NOW() ist eine eingebaute Funktion von MySQL (und anderen DBMS), die das aktuelle Datum und die Uhrzeit im Format YYYY-MM-DD HH:MM:SS zurückgibt. Warum also etwas ändern? Hier sind die Gründe:

\n\n
    \n
  • Datenbanklast: Jeder Aufruf von NOW() ist eine separate Anfrage an den Server. Wenn du 10.000 Zeilen einfügst, sendest du 10.000 Mal eine Anfrage, erhältst eine Antwort und fügst erst dann die Daten ein.
  • \n
  • Unterschiedliche Zeiten: Wenn dein Skript mehrere Sekunden läuft, kann NOW() in verschiedenen Queries unterschiedliche Zeiten zurückgeben (der Unterschied liegt zwar in Millisekunden, aber für Logs ist das kritisch).
  • \n
  • Portabilität: Beim Wechsel des DBMS (z. B. zu PostgreSQL oder SQLite) funktioniert NOW() möglicherweise nicht oder anders.
  • \n
\n\n

Lösung: Berechne die Zeit auf PHP-Seite und übergib sie als Parameter. So erhältst du eine einheitliche Zeit für alle Operationen, reduzierst die Datenbanklast und machst den Code universell einsetzbar.

\n\n
\n\n

2. So implementierst du NOW() in PHP: Drei bewährte Methoden

\n\n

2.1. Der Klassiker: date('Y-m-d H:i:s')

\n\n

Der einfachste und schnellste Weg ist die eingebaute Funktion date():

\n\n
<?php\n$now = date('Y-m-d H:i:s');\necho $now; // 2025-01-15 14:30:00\n?>
\n\n

Vorteile: Funktioniert überall, minimaler Speicherverbrauch, keine zusätzlichen Klassen nötig.
\nNachteile: Abhängig von der in php.ini eingestellten Zeitzone (date.timezone).

\n\n

2.2. Objektorientiert mit DateTime

\n\n

Der moderne Standard in PHP ist die Klasse DateTime. Sie ist flexibler und komfortabler:

\n\n
<?php\n$now = new DateTime();\necho $now->format('Y-m-d H:i:s'); // 2025-01-15 14:30:00\n?>
\n\n

Du kannst die Zeitzone explizit angeben:

\n\n
<?php\n$timezone = new DateTimeZone('Europe/Berlin');\n$now = new DateTime('now', $timezone);\necho $now->format('Y-m-d H:i:s'); // 2025-01-15 15:30:00 (MEZ)\n?>
\n\n

2.3. Mikrosekunden mit DateTimeImmutable

\n\n

Für präzise Messungen oder detaillierte Logs verwende DateTimeImmutable (das Originalobjekt bleibt unverändert):

\n\n
<?php\n$now = new DateTimeImmutable();\necho $now->format('Y-m-d H:i:s.u'); // 2025-01-15 14:30:00.123456\n?>
\n\n

Tipp: Wenn du nur die Zeit für einen Datenbankeintrag benötigst, verwende date() – es ist 10-15 % schneller als DateTime.

\n\n
\n\n

3. Performance-Optimierung: Tests und Vergleich

\n\n

Machen wir einen einfachen Benchmark. Vergleichen wir drei Methoden zur Ermittlung der aktuellen Zeit in einer Schleife mit 100.000 Iterationen:

\n\n
<?php\n$iterations = 100000;\n\n// Methode 1: date()\n$start = microtime(true);\nfor ($i = 0; $i < $iterations; $i++) {\n    $now = date('Y-m-d H:i:s');\n}\n$time1 = microtime(true) - $start;\n\n// Methode 2: DateTime\n$start = microtime(true);\nfor ($i = 0; $i < $iterations; $i++) {\n    $now = new DateTime();\n    $now->format('Y-m-d H:i:s');\n}\n$time2 = microtime(true) - $start;\n\n// Methode 3: DateTimeImmutable\n$start = microtime(true);\nfor ($i = 0; $i < $iterations; $i++) {\n    $now = new DateTimeImmutable();\n    $now->format('Y-m-d H:i:s');\n}\n$time3 = microtime(true) - $start;\n\necho \"date(): $time1 Sekunden\\n\";\necho \"DateTime: $time2 Sekunden\\n\";\necho \"DateTimeImmutable: $time3 Sekunden\\n\";\n?>
\n\n

Erwartetes Ergebnis: date() ist in der Regel am schnellsten, gefolgt von DateTime und DateTimeImmutable. Der Unterschied kann bei vielen Iterationen signifikant sein.

\n\n
\n\n

4. Zeitzonen richtig handhaben

\n\n

Ein häufiger Fehler ist die Annahme, dass die Server-Zeitzone immer korrekt eingestellt ist. Verwende immer explizit die gewünschte Zeitzone:

\n\n
<?php\n// Zeitzone für das gesamte Skript setzen\ndate_default_timezone_set('Europe/Berlin');\n\n// Oder für einzelne DateTime-Objekte\n$timezone = new DateTimeZone('America/New_York');\n$now = new DateTime('now', $timezone);\necho $now->format('Y-m-d H:i:s');\n?>
\n\n

Wichtig: Speichere Zeiten in der Datenbank immer in UTC und konvertiere sie erst bei der Ausgabe in die lokale Zeitzone. Das vermeidet Verwirrung bei Umstellungen auf Sommer-/Winterzeit.

\n\n
\n\n

5. Caching von NOW() für noch mehr Performance

\n\n

Wenn du innerhalb eines Skripts mehrmals die aktuelle Zeit benötigst, solltest du sie cachen:

\n\n
<?php\n// Einmal berechnen und wiederverwenden\n$now = date('Y-m-d H:i:s');\n\n// Später im Skript\n$query = \"INSERT INTO logs (created_at) VALUES ('$now')\";\n$query2 = \"UPDATE users SET last_login = '$now' WHERE id = 1\";\n?>
\n\n

Das stellt sicher, dass alle Operationen innerhalb eines Requests die exakt gleiche Zeit verwenden – perfekt für Logs, Transaktionen oder Audit-Trails.

\n\n
\n\n

Fazit

\n\n

Die Emulation von NOW() in PHP ist nicht nur eine Frage der Performance, sondern auch der Konsistenz und Portabilität. Mit den vorgestellten Methoden – date(), DateTime und DateTimeImmutable – hast du flexible Werkzeuge an der Hand. Denk immer an die Zeitzonen und cache die Zeit, wenn du sie mehrfach benötigst. So wird dein Code schneller, zuverlässiger und zukunftssicher.

\n\n

Hast du Fragen oder eigene Tipps? Schreib sie in die Kommentare!

Blogs

Buchempfehlungen