require_once otra incluir entre ejemplo diferencia desde carpeta archivo __file__ php include include-path require-once

php - otra - ¿Cómo funciona la resolución de ruta en require_once?



require_once path (4)

Estaba escribiendo una aplicación web en PHP, cuando me encontré con una situación extraña. Para ilustrar mi problema, considere una aplicación web de esta estructura:

/ index.php f1/ f1.php f2/ f2.php

Contenido de estos archivos:

index.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("../f2/f2.php"); ?>

f2.php: blanco

ahora, cuando intento abrir index.php en mi navegador, aparece este error:

Warning: require_once(../f2/f2.php) [function.require-once]: failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2 Fatal error: require_once() [function.require]: Failed opening required ''../f2/f2.php'' (include_path=''.:/usr/share/php:/usr/share/pear'') in /var/www/reqtest/f1/f1.php on line 2

¿Hay algo obvio que me estoy perdiendo? ¿Cómo funcionan las rutas incluidas en PHP?

Antes de hacer esta pregunta, intenté experimentar y descubrir. Configuré otra prueba, así:

/ index.php f1/ f1.php f2.php

index.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("f2.php"); ?>

f2.php: blanco

Para mi sorpresa (y total confusión), ¡todo salió bien!

Entonces, ¿cuál es el secreto detrás de la resolución de ruta?

PD. Vi esta pregunta , pero todavía no responde el segundo caso que he mencionado aquí.


Cuando abre index.php, el directorio de trabajo se establece en la carpeta en la que reside este archivo. Y dentro de f1.php inscrito, este directorio de trabajo no cambia.

Puede incluir archivos usando sus rutas absolutas, relativas al archivo incluido actual como este:

require_once(dirname(__FILE__).''/../../test/file.php'')

Pero mejor considere usar un autocargador si estos archivos contienen clases.


Normamente en tu vieja estructura

<?php require_once("f2/f2.php"); ?>

en lugar de

<?php require_once("../f2/f2.php"); ?>

Deberia trabajar. Por lo que sé php toma los caminos de la secuencia de comandos inicial


Parece que su servidor tiene habilitada la configuración open_basedir en la configuración de PHP. Esto hace que sea imposible incluir (y abrir) archivos en carpetas encima de su en el directorio structur (es decir, no puede usar ../ para ir a la estructura de carpetas).


Si incluye otro archivo, el directorio de trabajo permanece donde se encuentra el archivo incluido.

Sus ejemplos funcionan como se esperaba.

Editar: el segundo ejemplo funciona porque (directorio real) está en su ruta de inclusión (vea su mensaje de error).

Edit2: en su segundo ejemplo, el punto clave de su interés es esta línea:

<?php require_once("f2.php"); ?>

Al principio se verá en el directorio de trabajo actual ( /var/www/req_path_test ), pero no encuentra f2.php.

Como alternativa, intentará encontrar f2.php en su include_path ( ''.:/usr/share/php:/usr/share/pear'' ), comenzando con ''.'' (que es relativo al archivo real , no el incluido ).

Así que ''./f2.php'' funciona y el requerimiento no falla.