Introdução
\nUma aplicação PHP lenta não são apenas segundos perdidos de espera, mas também usuários frustrados, queda nas posições dos resultados de busca e aumento da carga no servidor. Felizmente, mesmo um desenvolvedor iniciante pode melhorar significativamente o desempenho do seu código sem se aprofundar em configurações complexas do sistema. Neste artigo, vamos abordar métodos básicos, mas eficazes, de otimização de aplicações PHP que ajudarão seu site ou serviço web a funcionar de forma mais rápida e estável.
\nVamos examinar quatro áreas principais: cache de dados, otimização do trabalho com bancos de dados, gerenciamento eficiente de memória e uso de recursos modernos do PHP. Cada seção será acompanhada de exemplos práticos de código.
\n\nCache: sua principal ferramenta de aceleração
\nCache é o armazenamento dos resultados de operações custosas para reutilização. Em vez de gerar uma página ou executar uma consulta SQL complexa toda vez, você entrega uma cópia previamente salva.
\n\nCache em memória com Memcached ou Redis
\nA maneira mais rápida de fazer cache é usar armazenamentos in-memory, como Memcached ou Redis. Eles armazenam dados na memória RAM, permitindo recuperá-los em microssegundos.
Exemplo de cache simples do resultado de uma consulta ao banco de dados usando Memcached:
<?php\n$memcached = new Memcached();\n$memcached->addServer('localhost', 11211);\n\n$cacheKey = 'user_profile_123';\n$userData = $memcached->get($cacheKey);\n\nif ($userData === false) {\n // Dados não estão em cache — executa a consulta pesada\n $userData = getUserFromDatabase(123);\n // Salva em cache por 10 minutos (600 segundos)\n $memcached->set($cacheKey, $userData, 600);\n}\n\necho $userData['name'];\n?>\n\nCache de páginas HTML inteiras
\nPara páginas estáticas ou que mudam raramente, você pode armazenar em cache a saída HTML pronta. Isso reduz a carga no interpretador PHP e no servidor web.
\n<?php\n$cacheFile = 'cache/index.html';\n$cacheTime = 3600; // 1 hora\n\nif (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) {\n // Entrega a página em cache\n readfile($cacheFile);\n exit;\n}\n\n// Inicia o buffer de saída\nob_start();\n\n// ... seu código PHP normal que gera a página ...\n\n$html = ob_get_clean();\nfile_put_contents($cacheFile, $html);\necho $html;\n?>\n\nOtimização do trabalho com bancos de dados
\nO banco de dados é o gargalo mais comum na maioria das aplicações PHP. Algumas mudanças simples podem proporcionar um enorme ganho de velocidade.
\n\nUse índices
\nSem índices, o MySQL executa uma varredura completa da tabela (full table scan), o que é extremamente lento em grandes volumes de dados. Adicione índices nos campos que participam das cláusulas WHERE, JOIN e ORDER BY.
-- Exemplo: tabela de pedidos\nCREATE INDEX idx_user_id ON orders(user_id);\nCREATE INDEX idx_created_at ON orders(created_at);\n\nEvite consultas N+1
\nEste é um erro clássico: em um loop, você faz uma consulta ao banco de dados para cada elemento. Em vez disso, use uma única consulta com JOIN ou subconsulta.
Exemplo ruim (N+1):
\n<?php\n$users = $db->query("SELECT * FROM users");\nforeach ($users as $user) {\n // Para cada usuário, é feita uma consulta separada\n $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']);\n}\n?>\n\nExemplo bom (uma consulta):
\n<?php\n$usersWithOrders = $db->query("\n SELECT u.*, o.* \n FROM users u \n LEFT JOIN orders o ON u.id = o.user_id\n");\n?>\n\nLimite a seleção de dados
\nNunca solicite todas as linhas se você precisa apenas de 10. Use