NOW() em PHP: Otimização e desempenho com datas e horas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

NOW() em PHP: a verdade que você não sabia sobre o tempo

\n\n

Todo 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?

\n\n

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\n

NOW() é 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\n
    \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
\n\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\n

2.1. O clássico date('Y-m-d H:i:s')

\n\n

A maneira mais simples e rápida é usar a função nativa date():

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

Vantagens: 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).

\n\n

2.2. O orientado a objetos DateTime

\n\n

O padrão moderno do PHP é a classe DateTime. Ela é mais flexível e conveniente:

\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

Você 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\n

2.3. Microssegundos com DateTimeImmutable

\n\n

Para medições precisas ou logs com alta granularidade, use DateTimeImmutable (não altera o objeto original):

\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

Dica: se você só precisa do horário para inserir no banco, use date() — ele é 10-15% mais rápido que DateTime.

\n\n
\n\n

3. Otimização de desempenho: testes e comparação

\n\n

Vamos 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\n

Resultado 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
\n\n

4. Fusos horários: o vilão silencioso

\n\n

Um 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\n

Boas 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 DateTime com DateTimeZone para manipulações complexas.
  • \n
\n\n
\n\n

5. Cache de tempo: quando usar e quando evitar

\n\n

Em 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\n

Atençã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\n

Emular 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.

\n\n

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!

Blogs

Book Recommendations