PHP incluye ruta relativa
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
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 dirname
que 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.
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_PATH
también podría derivarse de la ruta actual, $_SERVER['DOCUMENT_ROOT']
etc.