Principais erros de desenvolvedores PHP iniciantes: nível avançado

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

Principais erros de desenvolvedores PHP iniciantes: nível avançado



Quando você passa de scripts simples para aplicações web complexas em PHP, o número de armadilhas aumenta drasticamente. Muitos desenvolvedores, após dominarem a sintaxe básica, cometem erros sistêmicos que levam a vazamentos de memória, vulnerabilidades e queda de desempenho. Neste artigo, analisaremos 4 erros avançados que são comuns entre desenvolvedores de nível intermediário e mostraremos como corrigi-los.



1. Gerenciamento incorreto de sessões e vazamentos de memória



Um dos erros mais traiçoeiros é o trabalho incorreto com sessões. Muitos desenvolvedores armazenam grandes volumes de dados nas sessões (por exemplo, resultados de consultas ao banco de dados ou objetos serializados). Isso não apenas torna o sistema mais lento, mas também pode causar vazamentos de memória no servidor.



Problema: A sessão é bloqueada durante a execução do script. Se você armazenar 10 MB de dados nela, cada requisição lerá e gravará esse volume e, em requisições paralelas, elas serão enfileiradas.



Exemplo de código ruim:

<?phpsession_start();// Carregamos na sessão um array de 10000 registros$_SESSION['big_data'] = $db->query("SELECT * FROM logs")->fetchAll();?>


Solução: Use sessões apenas para identificação (user_id, token). Todos os outros dados armazene em cache (Redis, Memcached) ou no banco de dados.



<?phpsession_start();$_SESSION['user_id'] = $user->id;// Dados obtidos sob demanda$cache = new RedisCache();$data = $cache->get('user_data_' . $user->id);if (!$data) {    $data = $db->query("SELECT * FROM logs WHERE user_id = ?", [$user->id])->fetchAll();    $cache->set('user_data_' . $user->id, $data, 3600);}?>


2. Cache incorreto e ignorância de invalidação



O segundo erro mais comum é o cache "para sempre". Os desenvolvedores definem o tempo de vida do cache (TTL) para 24 horas ou mais e depois se surpreendem por que os usuários veem dados desatualizados. Pior ainda é o cache sem considerar alterações no banco de dados.



Problema: Se você armazenar em cache a lista de produtos por 1 hora e um administrador alterar o preço, os usuários verão o preço antigo por mais 60 minutos.



Exemplo de código ruim:

<?php$cacheKey = 'product_list';$products = $cache->get($cacheKey);if (!$products) {    $products = $db->query("SELECT * FROM products")->fetchAll();    $cache->set($cacheKey, $products, 86400); // 24 horas}?>


Solução: Use marcação de cache ou invalidação forçada ao alterar dados.



<?php// Ao atualizar um produtofunction updateProduct($id, $data) {    $db->update("products", $data, ["id" => $id]);    // Invalidamos o cache    $cache->delete('product_list');    $cache->delete('product_' . $id);}

// Ao ler$products = $cache->remember('product_list', 3600, function() use ($db) { return $db->query("SELECT * FROM products WHERE active = 1")->fetchAll();});?>


3. Injeções SQL através de funções "seguras"



Muitos desenvolvedores acreditam que, se usarem mysqli_real_escape_string() ou addslashes(), estão protegidos contra injeções SQL. Este é um equívoco perigoso. Essas funções não protegem contra todos os tipos de ataque, especialmente ao trabalhar com LIKE, ORDER BY e LIMIT.



Problema: A função mysqli_real_escape_string() não escapa caracteres para o operador LIKE (por exemplo, % e _). Se você inserir a entrada do usuário em LIKE, um invasor pode obter acesso a dados que não deveria ver.



Exemplo de vulnerabilidade:

<?php$search = $_GET['q'];$safe = mysqli_real_escape_string($conn, $search);$query = "SEL                

Blogs

Book Recommendations