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.