Fundamentos do PHP
Superglobais: $_SERVER, $_SESSION, $_COOKIE e $_FILES
Aprenda sobre superglobais: $_server, $_session, $_cookie e $_files
Fundamentos do PHP: Módulo 4 - Interagindo com a Web e Superglobais
Superglobais: $_SERVER, $_SESSION, $_COOKIE e $_FILES
Olá, futuro(a) desenvolvedor(a) PHP! 👋 Nesta aula, mergulharemos em um dos conceitos mais poderosos e frequentemente usados no PHP: as Superglobais. Elas são variáveis pré-definidas no PHP que estão sempre disponíveis em todos os escopos do seu script, permitindo que você acesse informações cruciais sobre o servidor, o usuário e a requisição HTTP.
Compreender e saber usar as superglobais é fundamental para construir aplicações web dinâmicas e interativas. Vamos explorar as mais importantes: $_SERVER, $_SESSION, $_COOKIE e $_FILES.
1. Introdução às Superglobais 🌐
As Superglobais em PHP são arrays associativos que contêm dados de diferentes fontes, como o ambiente do servidor, a requisição HTTP, os cookies do usuário, as variáveis de sessão e os arquivos enviados. A grande vantagem é que elas estão automaticamente disponíveis em qualquer parte do seu código, sem a necessidade de declarações especiais como global $variavel;.
Elas são a ponte entre o seu script PHP e o mundo exterior (o navegador, o servidor, outros scripts).
Vamos começar a desvendar cada uma delas!
2. $_SERVER: Informações do Servidor e do Ambiente de Execução 🖥️
A superglobal $_SERVER é um array associativo que contém informações geradas pelo servidor web ou pelo ambiente de execução. Ela oferece detalhes sobre a requisição atual, cabeçalhos HTTP, caminhos de arquivo e muito mais. É extremamente útil para depuração, logging e para tomar decisões baseadas no contexto da requisição.
Chaves Comuns e Seus Usos:
$_SERVER['REQUEST_METHOD']: O método da requisição usado para acessar a página (ex:GET,POST,PUT,DELETE).$_SERVER['REMOTE_ADDR']: O endereço IP do cliente que está visualizando a página atual.$_SERVER['HTTP_USER_AGENT']: O agente do usuário (navegador, sistema operacional) do cliente.$_SERVER['PHP_SELF']: O nome do arquivo do script atualmente em execução, relativo ao diretório raiz do documento.$_SERVER['SCRIPT_FILENAME']: O caminho absoluto do script atualmente em execução.$_SERVER['DOCUMENT_ROOT']: O diretório raiz do documento sob o qual o script atual está sendo executado.$_SERVER['QUERY_STRING']: A parte da URL que contém a string de consulta (tudo após o?).$_SERVER['HTTP_HOST']: O cabeçalhoHostda requisição atual.$_SERVER['SERVER_NAME']: O nome do host do servidor que está executando o script.$_SERVER['REQUEST_URI']: O URI que foi fornecido para acessar esta página.
Exemplo Prático:
Vamos criar um script para exibir algumas dessas informações.
<?php
// server_info.php
echo "<h1>Informações do Servidor e da Requisição</h1>";
echo "<p><strong>Método da Requisição:</strong> " . $_SERVER['REQUEST_METHOD'] . "</p>";
echo "<p><strong>Endereço IP do Cliente:</strong> " . $_SERVER['REMOTE_ADDR'] . "</p>";
echo "<p><strong>Navegador do Cliente:</strong> " . $_SERVER['HTTP_USER_AGENT'] . "</p>";
echo "<p><strong>Script Atual (PHP_SELF):</strong> " . $_SERVER['PHP_SELF'] . "</p>";
echo "<p><strong>Caminho Absoluto do Script:</strong> " . $_SERVER['SCRIPT_FILENAME'] . "</p>";
echo "<p><strong>Diretório Raiz do Documento:</strong> " . $_SERVER['DOCUMENT_ROOT'] . "</p>";
echo "<p><strong>Host da Requisição:</strong> " . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'N/A') . "</p>";
echo "<p><strong>URI da Requisição:</strong> " . $_SERVER['REQUEST_URI'] . "</p>";
// Exibindo todo o conteúdo de $_SERVER para depuração (use com cautela em produção)
echo "<h2>Conteúdo Completo de \$_SERVER:</h2>";
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
?>Ao acessar server_info.php em seu navegador, você verá informações detalhadas sobre a sua requisição e o ambiente do servidor. Se você adicionar uma query string, como server_info.php?nome=Aluno&idade=25, a chave QUERY_STRING também será preenchida.
3. $_SESSION: Gerenciando o Estado do Usuário 🧑💻
HTTP é um protocolo stateless (sem estado), o que significa que cada requisição é independente da anterior. No entanto, em aplicações web, frequentemente precisamos "lembrar" informações sobre um usuário entre diferentes páginas (ex: status de login, itens no carrinho de compras). É aqui que as sessões entram em jogo, e a superglobal $_SESSION é a chave para gerenciá-las.
Uma sessão permite armazenar dados específicos do usuário no servidor, identificando cada usuário através de um "ID de sessão" exclusivo, geralmente armazenado em um cookie no navegador do cliente.
Como Usar $_SESSION:
- Iniciar a Sessão: Você sempre deve chamar
session_start()no início de qualquer script que precise usar sessões. Isso inicializa a sessão ou retoma uma sessão existente. Deve ser a primeira coisa a ser executada no script, antes de qualquer saída para o navegador. - Armazenar Dados: Atribua valores ao array
$_SESSION. - Acessar Dados: Leia valores do array
$_SESSION. - Remover Dados: Use
unset()para remover variáveis específicas da sessão ousession_destroy()para encerrar completamente a sessão.
Exemplo Prático:
Vamos criar dois arquivos para demonstrar o uso de sessões.
pagina1.php (Define a sessão):
<?php
// pagina1.php
session_start(); // Inicia a sessão
$_SESSION['nome_usuario'] = 'Alice';
$_SESSION['id_usuario'] = 123;
$_SESSION['carrinho'] = ['item_a', 'item_b'];
echo "<h1>Página 1: Dados da sessão definidos!</h1>";
echo "<p>Olá, " . $_SESSION['nome_usuario'] . "!</p>";
echo "<p><a href='pagina2.php'>Ir para Página 2</a></p>";
?>pagina2.php (Acessa e destrói a sessão):
<?php
// pagina2.php
session_start(); // Inicia a sessão (ou retoma a existente)
echo "<h1>Página 2: Acessando dados da sessão</h1>";
if (isset($_SESSION['nome_usuario'])) {
echo "<p>Bem-vindo(a) novamente, " . $_SESSION['nome_usuario'] . " (ID: " . $_SESSION['id_usuario'] . ")!</p>";
echo "<p>Seu carrinho contém: " . implode(', ', $_SESSION['carrinho']) . "</p>";
// Remover um item específico da sessão
unset($_SESSION['carrinho'][0]);
echo "<p>Item 'item_a' removido do carrinho.</p>";
// Destruir toda a sessão (opcional, geralmente feito em logout)
// session_destroy();
// echo "<p>Sessão destruída. Se você voltar para a Página 1 e depois aqui, os dados não estarão mais lá.</p>";
} else {
echo "<p>Nenhum dado de sessão encontrado. Você pode ter vindo diretamente para esta página ou a sessão expirou/foi destruída.</p>";
}
echo "<p><a href='pagina1.php'>Voltar para Página 1</a></p>";
// Exemplo de como destruir a sessão completamente (descomente para testar)
// if (isset($_GET['logout'])) {
// session_destroy();
// echo "<p>Sessão encerrada com sucesso!</p>";
// // Redirecionar para evitar reenvio do logout
// header("Location: pagina1.php");
// exit();
// }
// echo "<p><a href='pagina2.php?logout=true'>Sair (Destruir Sessão)</a></p>";
?>Ao navegar de pagina1.php para pagina2.php, você verá que os dados definidos na primeira página estão disponíveis na segunda, demonstrando a persistência da sessão.
4. $_COOKIE: Armazenando Dados no Navegador do Usuário 🍪
Cookies são pequenos pedaços de dados que um servidor envia para o navegador web de um usuário. O navegador os armazena e os envia de volta ao servidor com cada requisição subsequente. Eles são frequentemente usados para lembrar informações sobre o usuário, como preferências, status de login (embora sessões sejam mais seguras para isso) ou para rastreamento.
A superglobal $_COOKIE é um array associativo que contém todos os cookies enviados pelo navegador na requisição atual.
Como Usar $_COOKIE:
- Definir um Cookie: Use a função
setcookie(). Ela deve ser chamada antes de qualquer saída para o navegador, assim comosession_start(). - Acessar Dados: Os cookies enviados pelo navegador estarão disponíveis no array
$_COOKIE. - Excluir um Cookie: Chame
setcookie()novamente com o mesmo nome do cookie e defina uma data de expiração no passado.
Parâmetros de setcookie():
setcookie(name, value, expire, path, domain, secure, httponly);
name: O nome do cookie.value: O valor do cookie.expire: O timestamp Unix quando o cookie expira.time() + segundospara definir um tempo futuro.path: O caminho no servidor onde o cookie estará disponível./significa todo o domínio.domain: O domínio para o qual o cookie é válido.secure: Setrue, o cookie só será enviado em conexões HTTPS.httponly: Setrue, o cookie não será acessível por scripts JavaScript, aumentando a segurança contra ataques XSS.
Exemplo Prático:
Vamos criar um script para definir, ler e excluir cookies.
<?php
// cookie_manager.php
// 1. Definir um cookie
if (!isset($_COOKIE['ultimo_acesso'])) {
setcookie('ultimo_acesso', date('Y-m-d H:i:s'), time() + (86400 * 30), "/"); // Expira em 30 dias
echo "<h1>Cookie 'ultimo_acesso' definido!</h1>";
} else {
echo "<h1>Cookie 'ultimo_acesso' já existe.</h1>";
echo "<p>Seu último acesso foi em: " . $_COOKIE['ultimo_acesso'] . "</p>";
}
// 2. Definir um cookie com mais opções (apenas para demonstração)
// setcookie('preferencia_tema', 'dark', time() + 3600, '/', '', false, true); // Expira em 1h, HTTP-only
echo "<h2>Cookies Recebidos:</h2>";
if (!empty($_COOKIE)) {
echo "<pre>";
print_r($_COOKIE);
echo "</pre>";
} else {
echo "<p>Nenhum cookie recebido nesta requisição.</p>";
}
// 3. Excluir um cookie (descomente para testar)
// Para excluir, defina a data de expiração no passado
if (isset($_GET['excluir_ultimo_acesso'])) {
setcookie('ultimo_acesso', '', time() - 3600, "/"); // Expira há 1 hora
echo "<p>Cookie 'ultimo_acesso' excluído. Atualize a página para confirmar.</p>";
// Redirecionar para evitar reenvio do logout
header("Location: cookie_manager.php");
exit();
}
echo "<p><a href='?excluir_ultimo_acesso=true'>Excluir Cookie 'ultimo_acesso'</a></p>";
?>Ao carregar cookie_manager.php pela primeira vez, o cookie ultimo_acesso será definido. Ao recarregar a página, você verá o valor do cookie que foi salvo. Clicar no link "Excluir Cookie" removerá o cookie do seu navegador.
5. $_FILES: Lidando com Upload de Arquivos ⬆️
A superglobal $_FILES é usada para lidar com arquivos enviados para o servidor via um formulário HTML. Quando um formulário é enviado com arquivos, o PHP popula $_FILES com informações sobre esses arquivos.
Para que o upload de arquivos funcione, seu formulário HTML deve ter o atributo enctype="multipart/form-data".
Estrutura de $_FILES:
$_FILES é um array bidimensional. Cada arquivo enviado terá uma entrada no array com o nome do campo input do formulário. Dentro de cada entrada, haverá as seguintes chaves:
name: O nome original do arquivo no computador do cliente.type: O tipo MIME do arquivo (ex:image/jpeg,text/plain).tmp_name: O caminho temporário onde o arquivo foi armazenado no servidor. Este é o caminho que você usará para mover o arquivo.error: Um código de erro associado ao upload (0 significa sucesso).size: O tamanho do arquivo em bytes.
Exemplo Prático:
Vamos criar um formulário HTML e um script PHP para processar o upload de arquivos.
upload_form.html:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload de Arquivos</title>
</head>
<body>
<h1>Upload de Arquivos com PHP</h1>
<form action="upload_handler.php" method="POST" enctype="multipart/form-data">
<label for="arquivo">Selecione um arquivo para upload:</label><br>
<input type="file" name="arquivo" id="arquivo"><br><br>
<input type="submit" value="Fazer Upload">
</form>
</body>
</html>upload_handler.php:
<?php
// upload_handler.php
echo "<h1>Resultado do Upload</h1>";
// Verifica se o formulário foi enviado e se o arquivo existe
if (isset($_FILES['arquivo']) && $_FILES['arquivo']['error'] === UPLOAD_ERR_OK) {
$arquivo_tmp = $_FILES['arquivo']['tmp_name'];
$nome_original = $_FILES['arquivo']['name'];
$tipo_arquivo = $_FILES['arquivo']['type'];
$tamanho_arquivo = $_FILES['arquivo']['size'];
$erro_arquivo = $_FILES['arquivo']['error'];
echo "<p><strong>Nome Original:</strong> " . htmlspecialchars($nome_original) . "</p>";
echo "<p><strong>Tipo MIME:</strong> " . htmlspecialchars($tipo_arquivo) . "</p>";
echo "<p><strong>Tamanho:</strong> " . $tamanho_arquivo . " bytes</p>";
echo "<p><strong>Caminho Temporário:</strong> " . htmlspecialchars($arquivo_tmp) . "</p>";
echo "<p><strong>Código de Erro:</strong> " . $erro_arquivo . "</p>";
// Define o diretório onde os arquivos serão salvos
$diretorio_uploads = 'uploads/';
// Cria o diretório se ele não existir
if (!is_dir($diretorio_uploads)) {
mkdir($diretorio_uploads, 0777, true);
}
// Gera um nome único para o arquivo para evitar sobrescrever e aumentar a segurança
$extensao = pathinfo($nome_original, PATHINFO_EXTENSION);
$novo_nome_arquivo = uniqid('upload_') . '.' . $extensao;
$caminho_destino = $diretorio_uploads . $novo_nome_arquivo;
// Move o arquivo da localização temporária para o diretório de destino
if (move_uploaded_file($arquivo_tmp, $caminho_destino)) {
echo "<p style='color: green;'>✅ Upload do arquivo " . htmlspecialchars($nome_original) . " realizado com sucesso!</p>";
echo "<p>Arquivo salvo como: " . htmlspecialchars($novo_nome_arquivo) . " em " . htmlspecialchars($diretorio_uploads) . "</p>";
} else {
echo "<p style='color: red;'>❌ Erro ao mover o arquivo para o destino.</p>";
}
} else {
// Trata outros erros de upload
if (isset($_FILES['arquivo'])) {
switch ($_FILES['arquivo']['error']) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
echo "<p style='color: red;'>❌ O arquivo é muito grande.</p>";
break;
case UPLOAD_ERR_PARTIAL:
echo "<p style='color: red;'>❌ O upload do arquivo foi feito apenas parcialmente.</p>";
break;
case UPLOAD_ERR_NO_FILE:
echo "<p style='color: red;'>❌ Nenhum arquivo foi enviado.</p>";
break;
case UPLOAD_ERR_NO_TMP_DIR:
echo "<p style='color: red;'>❌ Pasta temporária ausente.</p>";
break;
case UPLOAD_ERR_CANT_WRITE:
echo "<p style='color: red;'>❌ Falha ao escrever o arquivo em disco.</p>";
break;
case UPLOAD_ERR_EXTENSION:
echo "<p style='color: red;'>❌ Uma extensão do PHP interrompeu o upload do arquivo.</p>";
break;
default:
echo "<p style='color: red;'>❌ Erro desconhecido durante o upload.</p>";
break;
}
} else {
echo "<p>Nenhum arquivo foi enviado ou o formulário não foi submetido corretamente.</p>";
}
}
echo "<p><a href='upload_form.html'>Voltar ao formulário de upload</a></p>";
?>Observações Importantes sobre $_FILES e Uploads:
- Segurança: Sempre valide o tipo de arquivo (
type), tamanho (size) e nome (name) para evitar uploads maliciosos. Não confie apenas no tipo MIME fornecido pelo cliente. - Permissões: O diretório de destino (
uploads/no exemplo) deve ter permissões de escrita para o servidor web. move_uploaded_file(): Esta é a única maneira segura de mover um arquivo enviado. Nunca usecopy()ourename()diretamente com$_FILES['tmp_name'], pois isso pode ser um risco de segurança.uniqid(): Usaruniqid()ou funções similares para gerar nomes de arquivo únicos é uma boa prática para evitar colisões e também para esconder o nome original do arquivo, que pode conter informações sensíveis.
Resumo e Próximos Passos 🚀
Nesta aula, exploramos as superglobais mais essenciais do PHP:
$_SERVER: Fornece informações vitais sobre o ambiente do servidor e a requisição HTTP atual.$_SESSION: Permite manter o estado do usuário entre múltiplas requisições, essencial para funcionalidades como login e carrinhos de compra. Lembre-se desession_start().$_COOKIE: Permite armazenar pequenos pedaços de dados no navegador do cliente, úteis para preferências e rastreamento. Usesetcookie().$_FILES: Indispensável para lidar com uploads de arquivos de forma segura e eficiente. Lembre-se doenctypeno formulário e demove_uploaded_file().
Dominar essas superglobais é um passo crucial para construir aplicações web robustas e seguras em PHP. Elas são a base para a interação dinâmica entre o seu backend e o frontend do usuário.
Próximos Passos:
No próximo módulo, começaremos a explorar como o PHP interage com bancos de dados, um componente fundamental para a maioria das aplicações web modernas. Você usará muito do que aprendeu hoje para enviar e recuperar dados de formulários e gerenciar o estado do usuário em conjunto com um banco de dados!