Suas ideias em realidade digital!
>
O erro 500 em PHP é um dos problemas mais assustadores para quem administra sites, sistemas e APIs. Muitas vezes ele aparece como uma tela branca, uma mensagem genérica de erro interno ou uma resposta vazia no navegador. O problema é que o erro 500 não mostra automaticamente a causa real da falha.
Esse tipo de erro indica que algo deu errado no servidor, mas pode ter várias origens: erro de sintaxe no PHP, falha de conexão com banco,
permissão incorreta em arquivos, problema no .htaccess, limite de memória, extensão ausente, erro fatal ou exception não tratada.
Neste artigo, você vai aprender como descobrir a causa do erro 500 em PHP usando logs do Apache, Nginx e PHP, além de técnicas como
error_log, try/catch, ativação temporária de erros e boas práticas para ambiente de produção.
O erro 500 Internal Server Error significa que o servidor encontrou uma falha interna ao processar a requisição.
Em aplicações PHP, esse erro pode acontecer antes mesmo de qualquer HTML ou JSON ser enviado para o navegador.
Diferente de erros como 404 Not Found, que indicam uma página inexistente, o erro 500 aponta para uma falha no processamento
da aplicação ou na configuração do servidor.
Algumas causas comuns são:
.htaccess;require ou include;Em servidores configurados corretamente para produção, os detalhes dos erros PHP geralmente ficam ocultos do usuário. Isso é importante por segurança, porque mensagens internas podem revelar caminhos de arquivos, nomes de tabelas, dados de conexão ou trechos do código.
Por isso, quando ocorre uma falha, o navegador pode mostrar apenas:
500 Internal Server Error
Ou uma mensagem genérica como:
Erro interno no servidor.
A mensagem real normalmente estará em algum arquivo de log.
O log é o local onde o servidor registra informações sobre falhas, avisos e problemas internos. Para corrigir erro 500, você precisa encontrar a mensagem exata registrada no log.
Dependendo do ambiente, o erro pode aparecer em:
php.ini;Em servidores Linux com Apache, os logs costumam ficar em caminhos como:
/var/log/apache2/error.log
Em algumas distribuições, também pode ser:
/var/log/httpd/error_log
Para acompanhar o log em tempo real via terminal:
tail -f /var/log/apache2/error.log
Depois de rodar o comando, acesse novamente a página que está dando erro 500. O log deve mostrar a mensagem real do erro.
Em servidores com Nginx, o log de erro geralmente fica em:
/var/log/nginx/error.log
Para acompanhar em tempo real:
tail -f /var/log/nginx/error.log
Se você usa Nginx com PHP-FPM, pode ser necessário verificar também o log do PHP-FPM.
O caminho pode variar conforme a versão do PHP e a distribuição do servidor.
Exemplos comuns:
/var/log/php8.2-fpm.log
/var/log/php8.3-fpm.log
/var/log/php8.4-fpm.log
Também pode existir uma pasta específica:
/var/log/php-fpm/error.log
Se o erro 500 acontece em ambiente Nginx + PHP-FPM, conferir esse log é essencial.
Você pode verificar a configuração do PHP usando um arquivo temporário com phpinfo.
<?php
phpinfo();
Salve como info.php, acesse pelo navegador e procure por:
error_logdisplay_errorslog_errorsLoaded Configuration Fileinfo.php depois de usar.
Ele pode expor informações sensíveis do servidor.
No php.ini, as configurações mais importantes são:
log_errors = On
error_log = /var/log/php_errors.log
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
Em produção, o ideal é manter display_errors como Off e salvar os detalhes no log.
Após alterar o php.ini, reinicie o serviço do Apache ou PHP-FPM.
Exemplo com Apache:
sudo systemctl restart apache2
Exemplo com PHP-FPM:
sudo systemctl restart php8.3-fpm
Em ambiente de desenvolvimento, você pode exibir erros diretamente na tela para facilitar o diagnóstico.
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Coloque isso no início do arquivo apenas para testes locais ou ambiente controlado.
display_errors ativo em produção.
Mensagens de erro podem revelar dados internos do sistema.
A função error_log permite gravar mensagens no log do servidor.
Ela é útil para descobrir até onde o código está executando e quais valores estão chegando.
<?php
error_log('Iniciando processamento da API');
$id = $_GET['id'] ?? null;
error_log('ID recebido: ' . $id);
Você também pode registrar erros capturados em blocos try/catch.
<?php
try {
// Código que pode gerar erro
} catch (Throwable $e) {
error_log('Erro capturado: ' . $e->getMessage());
}
Um erro de sintaxe pode quebrar completamente o processamento do PHP. Exemplos comuns:
Exemplo com erro:
<?php
echo "Olá mundo"
O correto seria:
<?php
echo "Olá mundo";
O log geralmente mostra algo como Parse error ou syntax error.
Se sua aplicação tenta carregar um arquivo inexistente com require, o PHP pode gerar erro fatal.
<?php
require __DIR__ . '/config/database.php';
Se o caminho estiver errado, o log pode mostrar:
Failed opening required 'config/database.php'
Verifique:
Falhas na conexão com MySQL também são causa comum de erro 500.
<?php
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=sua_base;charset=utf8mb4',
'usuario',
'senha',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
);
} catch (PDOException $e) {
error_log('Erro de conexão com banco: ' . $e->getMessage());
http_response_code(500);
echo json_encode([
'success' => false,
'message' => 'Erro interno no servidor.'
]);
exit;
}
Em produção, registre a mensagem real no log, mas retorne uma mensagem genérica ao usuário.
Arquivos e pastas com permissões incorretas podem causar erro 500, principalmente em uploads, cache, logs ou sistemas que escrevem arquivos.
Exemplos de problemas:
.htaccess com regra inválida.Permissões comuns em Linux:
Arquivos: 644
Pastas: 755
Em alguns casos, pastas que precisam de escrita podem exigir configuração específica conforme o usuário do servidor web.
Em servidores Apache, o arquivo .htaccess pode causar erro 500 se tiver uma regra inválida.
Exemplo de regra comum:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
Problemas comuns no .htaccess:
mod_rewrite desativado;
Para testar, renomeie temporariamente o arquivo .htaccess e veja se o erro desaparece.
Em APIs, é comum o frontend esperar JSON. Se o PHP falhar antes de montar a resposta, o servidor pode retornar HTML ou resposta vazia.
Para evitar isso, padronize respostas de erro com JSON.
<?php
function jsonResponse(int $statusCode, array $data): void
{
http_response_code($statusCode);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;
}
Depois, use essa função nos blocos de erro.
<?php
jsonResponse(500, [
'success' => false,
'message' => 'Erro interno no servidor.'
]);
O uso de try/catch ajuda a capturar falhas e impedir que a aplicação quebre sem controle.
<?php
try {
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE id = :id");
$stmt->execute([
':id' => $id
]);
$usuario = $stmt->fetch();
jsonResponse(200, [
'success' => true,
'data' => $usuario
]);
} catch (PDOException $e) {
error_log('Erro PDO: ' . $e->getMessage());
jsonResponse(500, [
'success' => false,
'message' => 'Erro interno ao consultar os dados.'
]);
} catch (Throwable $e) {
error_log('Erro inesperado: ' . $e->getMessage());
jsonResponse(500, [
'success' => false,
'message' => 'Erro interno no servidor.'
]);
}
Você pode configurar um handler global para exceptions não capturadas.
<?php
set_exception_handler(function (Throwable $e) {
error_log('Exception não tratada: ' . $e->getMessage());
http_response_code(500);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'success' => false,
'message' => 'Erro interno no servidor.'
], JSON_UNESCAPED_UNICODE);
exit;
});
Esse handler ajuda a evitar que exceptions escapem sem resposta controlada.
Também é possível registrar erros PHP com set_error_handler.
<?php
set_error_handler(function ($severity, $message, $file, $line) {
error_log("Erro PHP: {$message} em {$file}:{$line}");
http_response_code(500);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'success' => false,
'message' => 'Erro interno no servidor.'
], JSON_UNESCAPED_UNICODE);
exit;
});
Esse tratamento ajuda a padronizar erros, mas ainda assim o log do servidor continua sendo fundamental.
Quando o PHP ultrapassa o limite de memória, pode ocorrer erro fatal. O log geralmente mostra algo como:
Allowed memory size exhausted
Isso pode acontecer em:
Melhor do que apenas aumentar memória é corrigir a causa, usando paginação, filtros, processamento em partes e consultas mais eficientes.
Se uma requisição demora demais, o PHP pode encerrar o processamento. O log pode mostrar:
Maximum execution time exceeded
Causas comuns:
Para resolver, revise a lógica, use paginação, crie índices no banco e evite tarefas muito pesadas em uma única requisição.
Após atualizar a versão do PHP, alguns códigos antigos podem parar de funcionar.
Verifique:
Nesse cenário, os logs normalmente mostram qual função, classe ou extensão está causando a falha.
Além do log do servidor, você pode criar um arquivo próprio para registrar eventos importantes da aplicação.
<?php
function appLog(string $message): void
{
$arquivo = __DIR__ . '/logs/app.log';
if (!is_dir(dirname($arquivo))) {
mkdir(dirname($arquivo), 0755, true);
}
$linha = '[' . date('Y-m-d H:i:s') . '] ' . $message . PHP_EOL;
file_put_contents($arquivo, $linha, FILE_APPEND);
}
appLog('Iniciando endpoint de usuários');
Esse tipo de log ajuda no diagnóstico de APIs, webhooks, rotas protegidas e integrações externas.
<?php
header('Content-Type: application/json; charset=utf-8');
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL);
function jsonResponse(int $statusCode, array $data): void
{
http_response_code($statusCode);
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;
}
set_exception_handler(function (Throwable $e) {
error_log('Exception não tratada: ' . $e->getMessage());
jsonResponse(500, [
'success' => false,
'message' => 'Erro interno no servidor.'
]);
});
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=sua_base;charset=utf8mb4',
'usuario',
'senha',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
if ($id <= 0) {
jsonResponse(422, [
'success' => false,
'message' => 'ID inválido.'
]);
}
$stmt = $pdo->prepare("SELECT id, nome, email FROM usuarios WHERE id = :id");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$usuario = $stmt->fetch();
if (!$usuario) {
jsonResponse(404, [
'success' => false,
'message' => 'Usuário não encontrado.'
]);
}
jsonResponse(200, [
'success' => true,
'data' => $usuario
]);
} catch (PDOException $e) {
error_log('Erro PDO: ' . $e->getMessage());
jsonResponse(500, [
'success' => false,
'message' => 'Erro interno ao consultar o banco de dados.'
]);
} catch (Throwable $e) {
error_log('Erro geral: ' . $e->getMessage());
jsonResponse(500, [
'success' => false,
'message' => 'Erro interno no servidor.'
]);
}
require e include estão corretos;.htaccess;error_log;try/catch em operações críticas;O log mostra a causa real. Sem ele, você fica apenas testando hipóteses.
Exibir erros diretamente para o usuário pode revelar informações sensíveis.
Uma única regra inválida pode derrubar todo o site em servidores Apache.
Falhas de conexão ou consultas incorretas devem ser capturadas com try/catch.
Em desenvolvimento, você pode exibir detalhes. Em produção, o correto é registrar em log e retornar mensagem genérica.
O erro 500 em PHP indica uma falha interna no servidor, mas a causa real quase sempre está registrada em algum log. Por isso, o melhor caminho é verificar os logs do Apache, Nginx, PHP-FPM ou PHP antes de alterar o código no escuro.
Depois de identificar a mensagem real, fica muito mais fácil corrigir o problema, seja ele um erro de sintaxe, conexão com banco, permissão de arquivo, configuração incorreta, limite de memória ou exception não tratada.
Em APIs PHP, também é importante padronizar respostas JSON, registrar detalhes com error_log e evitar expor mensagens internas
para o usuário final. Assim, sua aplicação fica mais segura, profissional e fácil de manter.
É um erro interno do servidor que indica que o PHP ou a configuração do servidor falhou ao processar a requisição.
O melhor caminho é verificar os logs do Apache, Nginx, PHP-FPM ou PHP. O log geralmente mostra a mensagem real do erro.
Sim. Em servidores Apache, regras incorretas no .htaccess podem causar erro 500.
Em ambiente de desenvolvimento, sim. Em produção, o ideal é manter os erros ocultos e registrar detalhes em log.
Sim. Falhas na conexão com MySQL, consultas inválidas ou exceptions não tratadas podem gerar erro 500.
Ative logs, trate exceptions com try/catch, configure handlers globais e padronize respostas de erro.
É um erro interno do servidor que indica que o PHP ou a configuração do servidor falhou ao processar a requisição.
O melhor caminho é verificar os logs do Apache, Nginx, PHP-FPM ou PHP. O log geralmente mostra a mensagem real do erro.
Sim. Em servidores Apache, regras incorretas no .htaccess podem causar erro 500.
Em ambiente de desenvolvimento, sim. Em produção, o ideal é manter os erros ocultos e registrar detalhes em log.
Sim. Falhas na conexão com MySQL, consultas inválidas ou exceptions não tratadas podem gerar erro 500.
Ative logs, trate exceptions com try/catch, configure handlers globais e padronize respostas de erro.