As funções include / require do PHP falham para caminhos com “../” ou “./”

1

Eu entrei no meu servidor de desenvolvimento hoje para descobrir que o PHP não estava incluindo alguns arquivos com essa mensagem E_WARNING:

Aviso: include_once (../pasta2.php) [function.include-once]: falha ao abrir fluxo: Nenhum arquivo ou diretório em /var/www/web/some_directory_1/file1.php on-line o que quer que seja

Eu fiz algumas pesquisas com nosso sysadmin e descobrimos que o PHP só falha quando tenta incluir caminhos de arquivo com um '../' ou './' no caminho.

Suponha que nossa estrutura de arquivos seja assim:

/ var / www / web /
- index.php
- file2.php
- some_directory_1 /
---- file1.php
---- file3.php

Se file1.php quiser incluir file2.php, isso funcionará:

include_once('/var/www/web/file2.php');

Mas isso não vai acontecer:

include_once('../file2.php');

Agora, espere um segundo ... Eu sei o que você está pensando! "Oh, seu include_path é apenas FUBAR." Bem, não exatamente.

Se você fizer isso no index.php, ele funciona:

include_once('some_directory_1/file1.php');

E se você fizer isso em file1.php, ele também funciona:

include_once('file3.php');

Nosso include_path está definido como .:/usr/lib/php . Nada sobre o ambiente do servidor foi alterado nas últimas 24 horas (sem atualizações, sem novo software, sem alterações nos includes, sem alterações nas configurações do Apache ou do PHP), eu e o sysadmin foram as únicas pessoas que acessaram o servidor no últimas 24 horas, e os includes estavam funcionando bem ontem. Nós esgotamos nossa lista de possíveis causas. Alguma pista do que poderia causar isso?

Editar: Esqueceu a mensagem de aviso do PHP.

    
por John Nicely 23.05.2012 / 02:04

1 resposta

2

O motivo pelo qual você está tendo problemas é que o caminho relativo em include / require é sempre relativo ao script inicial , e usar um caminho relativo faz com que o php ignore o valor include_path. Portanto, no seu exemplo include_once('../file2.php'); está procurando pelo arquivo no pai de index.php, assumindo que index.php é o script inicial.

Não sei por que isso mudaria de repente. Mas, a solução é não usar caminhos relativos - use o include_path ou use __DIR__ / dirname() como sugerido nos comentários.

    
por 23.05.2012 / 03:47