PHP incluye ruta relativa

Resuelto George B asked hace 54 años • 2 respuestas

Tengo el archivo /root/update/test.php. También hay un archivo, /root/connect.php; Este archivo tiene una línea

include "../config.php";

En /root/update/test.php. ahí está el código

set_include_path(".:/root");
include "connect.php";

Cuando ejecuto /root/update/test.php, encuentra connect.php, pero no encuentra config.php, lo que me da

PHP Warning:  include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2
PHP Warning:  include(): Failed opening '../config.php' for inclusion (include_path='.:/root')

Esto me resulta confuso porque las advertencias hacen que parezca que estoy haciendo todo correctamente: la ruta de inclusión es /root y está buscando el archivo ../config.php (/config.php), que existe. ¿Alguien puede aclararme esto? Tenga en cuenta que usar rutas absolutas no es una opción para mí debido a la implementación en un servidor de producción al que no tengo acceso.

Ubuntu/Apache

George B avatar Jan 01 '70 08:01 George B
Aceptado

Siempre puedes incluirlo usando __DIR__:

include(dirname(__DIR__).'/config.php');

__DIR__es una ' constante mágica ' y devuelve el directorio del archivo actual sin la barra diagonal final. En realidad es una ruta absoluta, sólo tienes que concatenar el nombre del archivo a __DIR__. En este caso, como necesitamos ascender un directorio usamos PHP dirnameque asciende en el árbol de archivos, y desde aquí podemos acceder config.php.

También puedes configurar la ruta raíz en este método:

define('ROOT_PATH', dirname(__DIR__) . '/');

en test.php establecería su raíz en el /root/nivel.

include(ROOT_PATH.'config.php');

Entonces debería funcionar para incluir el archivo de configuración desde donde desee.

meiamsome avatar Jul 01 '2013 15:07 meiamsome

Si bien aprecio que crea que las rutas absolutas no son una opción, es una mejor opción que las rutas relativas y que actualizar la ruta de inclusión de PHP.

Utilice rutas absolutas con una constante que pueda establecer según el entorno.

if (is_production()) {
    define('ROOT_PATH', '/some/production/path');
}
else {
    define('ROOT_PATH', '/root');
}

include ROOT_PATH . '/connect.php';

Como se comentó, ROOT_PATHtambién podría derivarse de la ruta actual, $_SERVER['DOCUMENT_ROOT']etc.

Jason McCreary avatar Jul 01 '2013 15:07 Jason McCreary