Resolver problemas

Erro PHP ao usar require_once, require, include_once ou include

Revisto a 3 min de leitura errores php php

Quando o PHP não consegue abrir um ficheiro pedido por require_once, require, include_once ou include, a mensagem completa indica o caminho pedido, que pode ser relativo, o ficheiro que fez a chamada e a sua linha. require interrompe a execução; include normalmente gera um aviso e permite continuar.

Um exemplo de mensagem é:

Fatal error: require(): Failed opening required '/home/usuario_cpanel/public_html/fichero.php' (include_path='.:php') in /home/usuario_cpanel/public_html/index.php on line 1

Este erro indica que o PHP não conseguiu abrir o recurso pedido por require ou include. Conserve também o aviso anterior, porque pode precisar se falhou o caminho, as permissões, open_basedir ou include_path.

No exemplo, index.php chama na sua linha 1 fichero.php. O PHP indica que não o conseguiu abrir nesse caminho; isso não demonstra por si só que o ficheiro não exista.

Possíveis causas e soluções

  1. Verifique o caminho exato do erro, a existência do ficheiro e as maiúsculas e minúsculas de cada nome.
  2. Verifique o DocumentRoot e a estrutura real da implementação. Um site não tem de estar necessariamente em /home/usuario/public_html e pode carregar código situado fora do diretório público.
  3. Reveja as permissões do ficheiro e de travessia dos diretórios pai, além do proprietário.
  4. Se o ficheiro existir e for legível, verifique as restrições open_basedir, include_path, wrappers e o diretório de trabalho usado para um caminho relativo.
  5. Se desapareceu, compare versões, implementações, cópias e registos. Considere uma intrusão apenas quando existirem alterações, acessos ou outras evidências que a sustentem.

Caminhos estáveis e dependências

Quando o ficheiro pertence ao mesmo projeto, um caminho baseado em __DIR__ evita depender do diretório a partir do qual o processo é executado:

require __DIR__ . '/config/bootstrap.php';

É um exemplo: esse ficheiro deve existir na estrutura real da sua aplicação. Se faltar vendor/autoload.php, reveja a implementação das dependências com o Composer e o seu ficheiro de bloqueio; não crie um ficheiro vazio nem substitua require por include para o esconder. Não construa um caminho de inclusão diretamente a partir de dados de um pedido.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.