Por que seu __DIR__ falhou ou o "inferno" dos caminhos no PHP

O que ganharei lendo este artigo?
Domínio de Escopo: Aprenderás que diretórios (pastas) e subdiretórios mudam a percepção do PHP.
Segurança com Constantes: Aprenderás a "travar" o caminho real do projeto para não depender tanto de onde o script está rodando.

Warning: fopen(leitura.txt): Failed to open stream: No such file or directory in /caminho/da/mente/do/ledor/inteligencia.php on line 0

[ Hits: 598 ]

Por: Buckminster em 28/03/2026


Exemplos



Lembrando que, em vez de /opt/apache24/htdocs/pasta1/pasta2/ pode ser /var/www/html/pasta1/pasta2 ou C:\Apache24\htdocs\pasta1\pasta2\ ou onde tu quiser de acordo com o que o sistema operacional permitir.

Lembrando também que:

DIRECTORY_SEPARATOR Janelas = \
DIRECTORY_SEPARATOR Linux|MacOS = /

Crio um diretório chamado "api" dentro de pasta2 que é a "raiz" (o diretório principal) do projeto.
O caminho para "api" é /opt/apache24/htdocs/pasta1/pasta2/api.

A partir de agora colocarei somente /pasta1/pasta2/, mas entenda que o localhost está antes.

Lembrando que /opt/apache24/htdocs e C:\Apache24\htdocs e /var/www/html são, por padrão, o famoso localhost no Linux e no Janelas, aquele que, quando tu digita localhost na barra de endereços, o Apache grita It works! porque encontrou o arquivo index.html (C:\Apache24\htdocs\index.html) e dentro dele tem escrito It works e se fica todo feliz porque conseguiu fazer o Apache funcionar.

No Linux, o localhost na instalação padrão é /var/www/html (a não ser que tu mude, mas ai é problema teu, não meu).

Você, caro leitor, se for uma pessoa inteligente, deve ter percebido a diferença do Linux para o Janelas do "detalhe" das barras separadoras que formam o caminho para os diretórios e arquivos.
Já veremos esse "detalhe" também.

Antes, caro leitor, veremos uma coisa chamada Estratégia do "Ponto de Entrada Único", do conceito de estratégia, em grego strateegia, em latim strategi, em francês stratégie... os senhores estão anotando?
Nessa estratégia profissional utilizamos um arquivo central chamado config.php ou autoload.php ou de_o_nome_que_quiser.php na raiz real do projeto, ou seja, no nosso caso: /pasta1/pasta2/de_o_nome_que_quiser.php.
Neste arquivo definimos as constantes com seus caminhos que utilizaremos no projeto|site|aplicação, etc.
Define-se, por exemplo, a constante RAIZ_SIS (ou DE_O_NOME_QUE_QUISER, agora na versão maiúscula) uma única vez nesse arquivo de configuração.

Segue um exemplo:
<?php
// Este arquivo autoload.php fica na RAIZ do projeto|site|aplicativo...
// __DIR__ aqui SEMPRE serah a raiz.
// dirname(__DIR__) recua um nivel na estrutura de pastas (Funcao Nativa).
// Exemplo: dirname(__DIR__) . DIRECTORY_SEPARATOR . "autoload.php";
// __DIR__ . DIRECTORY_SEPARATOR; = C:\Apache24\htdocs\pasta1\pasta2\
// Janelas - RAIZ_SIS (ou PATH_ROOT) = C:\Apache24\htdocs\pasta1\pasta2\
// Linux - RAIZ_SIS (ou PATH_ROOT) = /opt/apache24/htdocs/pasta1/pasta2/
// Define a URL base do site:
// define('URL_BASE', 'http://localhost/pasta1/pasta2');
// PATH_ROOT: Caminho absoluto no disco (para utilizar com file_put_contents, require, include, etc).
// URL_BASE: Caminho do navegador (para utilizar com href, src de imagens, etc).
// DIRECTORY_SEPARATOR Janelas = \
// DIRECTORY_SEPARATOR Linux|MacOS = /
if (!defined('RAIZ_SIS')) {
    define('RAIZ_SIS', __DIR__ . DIRECTORY_SEPARATOR);
}
if (!defined('PASTA_API')) {
    define('PASTA_API', RAIZ_SIS . 'api' . DIRECTORY_SEPARATOR);
}
Aproveitamos e já definimos, também, uma constante para o diretório api chamada PASTA_API, cujo caminho é /opt/apache24/htdocs/pasta1/pasta2/api/.
Repare, vivente, que no final da tripa tem uma barra (/ ou \), essa é a constante predefinida DIRECTORY_SEPARATOR agindo.
O PHP identifica o sistema operacional e essa constante, se for chamada, finca no final da tripa a barra de acordo com o sistema operacional.
E assim tu vai, alegremente, definindo e/ou utilizando as constantes necessárias.

Lembrando que __DIR__ é uma das constantes mágicas do PHP.
https://www.php.net/manual/en/language.constants.magic.php

Da página do PHP:
__DIR__ - "O diretório do arquivo. Se usada dentro de um include, o diretório do arquivo incluído será retornado.
Isso é equivalente a dirname(__FILE__).
O nome do diretório não possui barra no final, a menos que seja o diretório raiz."
Explica nada e diz coisa nenhuma.

Exemplo Real

Nesse exemplo real tenho essas chamadas aos arquivos:
require_once __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
require_once PASTA_API . 'proc_criar.php';

E dentro do arquivo proc_criar.php tenho estas definições:
$arquivoCursos = RAIZ_SIS . 'cursos.txt';
$arquivoBkpExtra = $pastaExtra . DIRECTORY_SEPARATOR . 'cursos_bkp_extra.txt';

Criei um arquivo "teste.php", coloquei dentro o conteúdo abaixo para solucionar essa bagunça:
require_once  __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";
$arquivoCursos = RAIZ_SIS . 'cursos.txt';
$pastaExtra = RAIZ_SIS . 'copiados';
$arquivoBkpExtra = $pastaExtra . DIRECTORY_SEPARATOR . 'cursos_bkp_extra.txt';
die("Caminho Real: " . realpath($arquivoBkpExtra));

Executei o arquivo e na saída auto-explicativa apareceu:
Caminho Real: C:\Apache24\htdocs\pasta1\pasta2\copiados\cursos_bkp_extra.txt
e
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/copiados/cursos_bkp_extra.txt

E executei também:
require_once  __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";
$arquivoCursos = RAIZ_SIS . 'cursos.txt';
die("Caminho Real: " . realpath($arquivoCursos));
$pastaExtra = RAIZ_SIS . 'copiados';
$arquivoBkpExtra = $pastaExtra . DIRECTORY_SEPARATOR . 'cursos_bkp_extra.txt';

Saída:
Caminho Real: C:\Apache24\htdocs\pasta1\pasta2\cursos.txt
e
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/cursos.txt

Se tu mudar o nome da pasta "pasta2" para "projeto_final", não precisa mexer em nada porque o __DIR__ no arquivo central se atualiza sozinho.
RAIZ_SIS será exatamente a mesma string em qualquer lugar do sistema.
Se tu escrever "require_once RAIZ_SIS . 'cursos.txt'", o PHP sempre buscará o arquivo na pasta principal, esteja você no diretório /api/, /admin/ ou no index.php ou na casa do ... .
Se o arquivo ficasse dentro da pasta api, você usaria a constante que definiu no arquivo central: include_once PASTA_API . 'arquivo'.

Obs.: Ao usar a função realpath, o script em execução deve ter permissões de executável em todos os diretórios na hierarquia, caso contrário realpath() retornará false.

Liberdade total.
O PHP é o Linux das linguagens de programação!

Página anterior     Próxima página

Páginas do artigo
   1. Por que o seu __DIR__ falhou?
   2. Exemplos
   3. Caminhos Absolutos e Caminhos Relativos
   4. Conclusão
Outros artigos deste autor

Instalação e configuração do Chrony

Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla

Executar Scripts Remotamente

Compilação de Kernel

Instalar e Configurar o Slackware Linux em 2025

Leitura recomendada

Upload de imagens com criação de thumbnails em PHP

Organizando fotos de camêra digital

Trabalhando com arquivos em PHP

Manipulação de arquivos com PHP

Enviar mensagem ao usuário trabalhando com as opções do php.ini

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts