NOW() in PHP: Die Wahrheit über Zeit, die du noch nicht kanntest
\n\nJeder 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?
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\nNOW() 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
- 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
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\n2.1. Der Klassiker: date('Y-m-d H:i:s')
\n\nDer einfachste und schnellste Weg ist die eingebaute Funktion date():
<?php\n$now = date('Y-m-d H:i:s');\necho $now; // 2025-01-15 14:30:00\n?>\n\nVorteile: Funktioniert überall, minimaler Speicherverbrauch, keine zusätzlichen Klassen nötig.
\nNachteile: Abhängig von der in php.ini eingestellten Zeitzone (date.timezone).
2.2. Objektorientiert mit DateTime
\n\nDer moderne Standard in PHP ist die Klasse DateTime. Sie ist flexibler und komfortabler:
<?php\n$now = new DateTime();\necho $now->format('Y-m-d H:i:s'); // 2025-01-15 14:30:00\n?>\n\nDu 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\n2.3. Mikrosekunden mit DateTimeImmutable
\n\nFür präzise Messungen oder detaillierte Logs verwende DateTimeImmutable (das Originalobjekt bleibt unverändert):
<?php\n$now = new DateTimeImmutable();\necho $now->format('Y-m-d H:i:s.u'); // 2025-01-15 14:30:00.123456\n?>\n\nTipp: Wenn du nur die Zeit für einen Datenbankeintrag benötigst, verwende date() – es ist 10-15 % schneller als DateTime.
\n\n
3. Performance-Optimierung: Tests und Vergleich
\n\nMachen 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\nErwartetes Ergebnis: date() ist in der Regel am schnellsten, gefolgt von DateTime und DateTimeImmutable. Der Unterschied kann bei vielen Iterationen signifikant sein.
\n\n
4. Zeitzonen richtig handhaben
\n\nEin 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\nWichtig: 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\nWenn 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\nDas 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\nDie 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.
Hast du Fragen oder eigene Tipps? Schreib sie in die Kommentare!