NOW() en PHP : optimisation et performance pour les dates et heures

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

NOW() en PHP : la vérité que vous ignoriez sur le temps

\n\n

Chaque développeur PHP a déjà écrit une requête SQL comme INSERT INTO logs (created_at) VALUES (NOW()). Et ça fonctionne parfaitement. Mais que diriez-vous si je vous disais que l'utilisation de la fonction MySQL NOW() dans chaque requête n'est pas toujours optimale ? Et si votre projet traite des millions de requêtes ? Ou si vous avez besoin d'une heure unique pour tout un script ?

\n\n

Dans cet article, nous allons voir comment émuler la fonction NOW() en PHP, améliorer les performances de vos applications et éviter les erreurs courantes liées au temps. Vous apprendrez quand l'équivalent PHP de NOW() est plus rapide qu'un appel à la base de données, et quels pièges cache la gestion des fuseaux horaires.

\n\n
\n\n

1. Qu'est-ce que NOW() et pourquoi l'émuler en PHP ?

\n\n

NOW() est une fonction intégrée de MySQL (et d'autres SGBD) qui renvoie la date et l'heure actuelles au format YYYY-MM-DD HH:MM:SS. Pourquoi changer une formule qui marche ? Voici quelques nuances :

\n\n
    \n
  • Charge sur la BDD : chaque appel à NOW() est une requête distincte au serveur. Si vous insérez 10 000 lignes, vous envoyez 10 000 requêtes, recevez 10 000 réponses, et seulement ensuite insérez les données.
  • \n
  • Heure variable : si votre script prend plusieurs secondes, NOW() dans différentes requêtes peut renvoyer des heures différentes (la différence est en millisecondes, mais pour les logs, c'est critique).
  • \n
  • Portabilité : en changeant de SGBD (par exemple, pour PostgreSQL ou SQLite), NOW() peut ne pas fonctionner ou se comporter différemment.
  • \n
\n\n

Solution : calculer l'heure côté PHP et la passer en paramètre. Vous obtenez ainsi une heure unique pour toutes les opérations, réduisez la charge sur la BDD et rendez votre code universel.

\n\n
\n\n

2. Comment implémenter NOW() en PHP : trois méthodes éprouvées

\n\n

2.1. La classique date('Y-m-d H:i:s')

\n\n

La méthode la plus simple et la plus rapide consiste à utiliser la fonction native date() :

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

Avantages : fonctionne partout, consommation mémoire minimale, pas besoin de charger des classes supplémentaires.
\nInconvénients : dépend du fuseau horaire défini dans php.ini (date.timezone).

\n\n

2.2. L'approche orientée objet avec DateTime

\n\n

Le standard moderne de PHP est la classe DateTime. Elle est plus flexible et pratique :

\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

Vous pouvez spécifier explicitement le fuseau horaire :

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

2.3. Microsecondes avec DateTimeImmutable

\n\n

Pour des mesures précises ou des logs haute résolution, utilisez DateTimeImmutable (ne modifie pas l'objet d'origine) :

\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

Conseil : si vous avez seulement besoin de l'heure pour une insertion en BDD, utilisez date() — il est 10 à 15 % plus rapide que DateTime.

\n\n
\n\n

3. Optimisation des performances : tests et comparaison

\n\n

Faisons un simple benchmark. Comparons trois méthodes pour obtenir l'heure actuelle dans une boucle de 100 000 itérations :

\n\n
<?php\n$iterations = 100000;\n\n// Méthode 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// Méthode 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// Méthode 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 sec\\n\";\necho \"DateTime : $time2 sec\\n\";\necho \"DateTimeImmutable : $time3 sec\\n\";\n?>
\n\n

Résultat typique : date() est environ 2 à 3 fois plus rapide que DateTime et DateTimeImmutable. Pour des applications à fort trafic, cette différence compte.

\n\n
\n\n

4. Gestion des fuseaux horaires : le piège classique

\n\n

L'erreur la plus fréquente est d'ignorer le fuseau horaire. Si votre serveur est réglé sur UTC et vos utilisateurs sont à Paris, date('Y-m-d H:i:s') renverra l'heure UTC, pas l'heure locale.

\n\n

Solution : définissez le fuseau horaire par défaut dans votre script :

\n\n
<?php\ndate_default_timezone_set('Europe/Paris');\n$now = date('Y-m-d H:i:s'); // Heure de Paris\necho $now;\n?>
\n\n

Ou utilisez DateTime avec un fuseau explicite :

\n\n
<?php\n$now = new DateTime('now', new DateTimeZone('Europe/Paris'));\necho $now->format('Y-m-d H:i:s');\n?>
\n\n

Important : stockez toujours les dates en UTC dans votre base de données et convertissez-les côté client ou lors de l'affichage. Cela évite les confusions lors des changements d'heure (été/hiver).

\n\n
\n\n

5. Cache et optimisation avancée

\n\n

Si vous appelez NOW() plusieurs fois dans le même script, inutile de recalculer l'heure à chaque fois. Stockez-la dans une variable :

\n\n
<?php\n$now = date('Y-m-d H:i:s');\n\n// Utilisez $now partout dans votre script\n$sql1 = \"INSERT INTO logs (created_at) VALUES ('$now')\";\n$sql2 = \"UPDATE users SET last_login = '$now' WHERE id = 42\";\n?>
\n\n

Pour des applications critiques, vous pouvez même mettre en cache l'heure avec APCu ou Redis :

\n\n
<?php\n// Avec APCu\nif (apcu_exists('cached_now')) {\n    $now = apcu_fetch('cached_now');\n} else {\n    $now = date('Y-m-d H:i:s');\n    apcu_store('cached_now', $now, 1); // Cache pendant 1 seconde\n}\n?>
\n\n

Cette technique est utile pour les APIs ou les applications temps réel où chaque milliseconde compte.

\n\n
\n\n

Conclusion

\n\n

Émuler NOW() en PHP n'est pas seulement une astuce d'optimisation, c'est une bonne pratique pour écrire un code portable, performant et fiable. Que vous utilisiez date(), DateTime ou DateTimeImmutable, l'essentiel est de contrôler le fuseau horaire et d'éviter les appels inutiles à la base de données.

\n\n

Récapitulatif :

\n
    \n
  • Utilisez date('Y-m-d H:i:s') pour la rapidité.
  • \n
  • Préférez DateTime pour la flexibilité et la gestion des fuseaux.
  • \n
  • Stockez toujours les dates en UTC en base de données.
  • \n
  • Mettez en cache l'heure si vous l'utilisez intensivement.
  • \n
\n\n

Et vous, quelle méthode utilisez-vous dans vos projets PHP ? Partagez votre expérience dans les commentaires !

Blogs

Book Recommendations