NOW() em PHP: a verdade que você não sabia sobre o tempo
\n\nTodo desenvolvedor PHP já escreveu pelo menos uma vez uma consulta SQL como INSERT INTO logs (created_at) VALUES (NOW()). E isso funciona perfeitamente. Mas e se eu te disser que usar a função NOW() do MySQL em toda consulta nem sempre é o ideal? E se o seu projeto processa milhões de requisições? Ou se você precisa de um horário único para todo um script?
Neste artigo, vamos explorar como emular a função NOW() no PHP, como aumentar o desempenho das aplicações e evitar erros comuns relacionados ao tempo. Você descobrirá quando o análogo do NOW() em PHP é mais rápido do que consultar o banco de dados e quais armadilhas o trabalho com fusos horários esconde.
\n\n\n\n
1. O que é NOW() e por que emulá-lo no PHP?
\n\nNOW() é uma função nativa do MySQL (e de outros SGBDs) que retorna a data e hora atuais no formato YYYY-MM-DD HH:MM:SS. Parece que não há motivo para mudar, certo? Mas existem nuances:
- \n
- Sobrecarga no banco: cada chamada de
NOW()é uma consulta separada ao servidor. Se você insere 10.000 linhas, envia 10.000 consultas, recebe a resposta e só então insere os dados. \n - Horários diferentes: se o seu script leva alguns segundos para executar,
NOW()em consultas diferentes pode retornar horários distintos (embora a diferença seja em milissegundos, para logs isso pode ser crítico). \n - Portabilidade: ao mudar de SGBD (por exemplo, para PostgreSQL ou SQLite),
NOW()pode não funcionar ou se comportar de forma diferente. \n
Solução: calcular o horário no lado do PHP e passá-lo como parâmetro. Assim, você obtém um horário único para todas as operações, reduz a carga no banco e torna o código universal.
\n\n\n\n
2. Como implementar NOW() no PHP: três maneiras comprovadas
\n\n2.1. O clássico date('Y-m-d H:i:s')
\n\nA maneira mais simples e rápida é usar a função nativa date():
<?php\n$now = date('Y-m-d H:i:s');\necho $now; // 2025-01-15 14:30:00\n?>\n\nVantagens: funciona em qualquer lugar, consumo mínimo de memória, não requer carregar classes adicionais.
\nDesvantagens: depende do fuso horário definido no php.ini (date.timezone).
2.2. O orientado a objetos DateTime
\n\nO padrão moderno do PHP é a classe DateTime. Ela é mais flexível e conveniente:
<?php\n$now = new DateTime();\necho $now->format('Y-m-d H:i:s'); // 2025-01-15 14:30:00\n?>\n\nVocê pode definir explicitamente o fuso horário:
\n\n<?php\n$timezone = new DateTimeZone('America/Sao_Paulo');\n$now = new DateTime('now', $timezone);\necho $now->format('Y-m-d H:i:s'); // 2025-01-15 14:30:00 (BRT)\n?>\n\n2.3. Microssegundos com DateTimeImmutable
\n\nPara medições precisas ou logs com alta granularidade, use DateTimeImmutable (não altera o objeto original):
<?php\n$now = new DateTimeImmutable();\necho $now->format('Y-m-d H:i:s.u'); // 2025-01-15 14:30:00.123456\n?>\n\nDica: se você só precisa do horário para inserir no banco, use date() — ele é 10-15% mais rápido que DateTime.
\n\n
3. Otimização de desempenho: testes e comparação
\n\nVamos fazer um benchmark simples. Compararemos três maneiras de obter o horário atual em um loop de 100.000 iterações:
\n\n<?php\n$iterations = 100000;\n\n// Método 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étodo 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étodo 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 segundos\\n\";\necho \"DateTime: $time2 segundos\\n\";\necho \"DateTimeImmutable: $time3 segundos\\n\";\n?>\n\nResultado esperado: date() é consistentemente mais rápido, especialmente em loops grandes. Para a maioria dos casos, a diferença é pequena, mas em aplicações de alto tráfego, cada microssegundo conta.
\n\n
4. Fusos horários: o vilão silencioso
\n\nUm dos maiores problemas ao trabalhar com datas em PHP é o gerenciamento de fusos horários. Se você não definir corretamente, pode acabar com horários inconsistentes entre o PHP e o banco de dados.
\n\nBoas práticas:
\n- \n
- Defina o fuso horário no início do script com
date_default_timezone_set('America/Sao_Paulo'). \n - Armazene sempre no banco em UTC e converta apenas na exibição. \n
- Use
DateTimecomDateTimeZonepara manipulações complexas. \n
\n\n
5. Cache de tempo: quando usar e quando evitar
\n\nEm alguns cenários, você pode querer "congelar" o horário no início da execução do script. Isso é útil para logs ou operações que precisam de consistência temporal.
\n\n<?php\n// Cache do horário no início do script\n$now_cached = date('Y-m-d H:i:s');\n\n// Use $now_cached em todo o script\n$stmt = $pdo->prepare('INSERT INTO logs (message, created_at) VALUES (?, ?)');\n$stmt->execute(['Mensagem de log', $now_cached]);\n?>\n\nAtenção: evite cache se o script for muito longo (minutos) e a precisão do horário for crítica. Nesse caso, prefira obter o horário do banco ou usar microssegundos.
\n\n\n\n
Conclusão
\n\nEmular NOW() no PHP não é apenas uma questão de desempenho, mas também de boas práticas e portabilidade. Use date() para simplicidade e velocidade, DateTime para flexibilidade, e lembre-se de gerenciar fusos horários com cuidado. Com essas técnicas, seu código PHP será mais rápido, confiável e preparado para o futuro.
Próximos passos: teste os exemplos acima no seu projeto e meça a diferença. Compartilhe nos comentários qual método você prefere!