2008-08-07 11 views
82

Tengo una estructura de directorios como la siguiente;¿Cómo incluir archivos PHP que requieren una ruta absoluta?

script.php

inc/include1.php
inc/include2.php

objetos/object1.php
objetos/object2.php

jabón/soap.php

Ahora, uso esos objetos tanto en script.php y /soap/soap.php, podría moverlos, pero quiero la estructura de directorios así por una razón específica. Al ejecutar script.php la ruta de inclusión es inc/include.php y al ejecutar /soap/soap.php es ../inc, las rutas absolutas funcionan, /mnt/webdev/[project name]/inc/include1.php... Pero es una solución fea si alguna vez quiero mover el directorio a una ubicación diferente.

Entonces, ¿hay alguna manera de usar rutas relativas, o una forma de generar de manera programática el "/mnt/webdev/[project name]/"?

Respuesta

138

Esto debería funcionar

$root = realpath($_SERVER["DOCUMENT_ROOT"]); 

include "$root/inc/include1.php"; 

Editar: añadido imporvement por aussieviking

+0

tener cuidado, esto sólo trabajará si se ejecuta la secuencia de comandos a través de un servidor web que puebla 'DOCUMENT_ROOT' – Phil

+0

sólo una pregunta, ¿por realpath() por $ _SERVER [ "DOCUMENT_ROOT"]? Esto no dará salida siempre a la ruta canónica? –

6

Puede definir una constante con la ruta al directorio raíz de su proyecto, y luego poner eso al comienzo de la ruta.

40

Puede usar rutas relativas. Pruebe __FILE__. . Esta es una constante de PHP que siempre devuelve la ruta/nombre de archivo de la secuencia de comandos que está en Así, en soap.php, usted podría hacer:

include dirname(__FILE__).'/../inc/include.php'; 

La ruta completa y el nombre del archivo . Si se usa dentro de un include, se devuelve el nombre del archivo incluido. Desde PHP 4.0.2, __FILE__ siempre contiene una ruta absoluta con enlaces simbólicos resueltos, mientras que en versiones anteriores contenía la ruta relativa bajo algunas circunstancias. (source)

Otra solución sería la creación de una ruta de inclusión en su httpd.conf o un archivo .htaccess.

+8

Creo que deberías agregar un '/' al comienzo de la expresión entrecomillada, para separar el '..' del nombre __FILE__. – Dunaril

+8

Tenga en cuenta que desde PHP 5.3.0 puede usar la constante mágica '__DIR__' en lugar de tener que usar' dirname (__ FILE __) '. [(PHP docs)] (http://www.php.net/manual/en/language.constants.predefined.php) –

+3

'include dirname (__ FILE __). '/ ../inc/include.php';' No olvide el "/" antes de la ruta relativa. –

1

Creo que la mejor manera es poner sus inclusiones en su ruta include de PHP. Hay varias maneras de hacer esto dependiendo de su configuración.

A continuación, puede referirse a

require_once 'inc1.php'; 

desde el interior de cualquier archivo, independientemente de donde es si incluye en su web o en su archivos accesibles, o cualquier otro nivel de subdirectorios anidados.

Esto le permite tener sus archivos de inclusión fuera de la raíz del servidor web, lo cual es una buena práctica.

p. Ej.

site directory 
    html (web root) 
     your web-accessible files 
    includes 
     your include files 

Además, la salida __autoload de carga diferida de archivos de clase

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

0

@Flubba, ¿esto me permite tener carpetas dentro de mi include ? los directorios de inclusión plana me dan pesadillas. como todo el directorio de objetos debería estar en el directorio inc.

Oh, sí, absolutamente. Así, por ejemplo, se utiliza una sola capa de subcarpetas, en general:

require_once('library/string.class.php') 

Es necesario tener cuidado con confiar en la ruta de inclusión demasiado en sitios muy alto tráfico, debido a que PHP tiene que buscar a través del directorio actual y entonces todos los directorios de la ruta de inclusión con el fin de ver si el archivo está allí y esto puede ralentizar las cosas si usted está recibiendo golpes.

Así, por ejemplo, si está haciendo MVC, que había puesto la ruta a su directoy aplicación en la ruta de inclusión y especifique refieren a las cosas en forma

'model/user.class' 
'controllers/front.php' 

o lo que sea.

Pero, en términos generales, simplemente te permite trabajar con rutas realmente cortas en tu PHP que funcionarán desde cualquier lugar y es mucho más fácil de leer que todo el documento raíz raíz root malarkey.

El beneficio de esas alternativas basadas en scripts que otros han sugerido es que funcionan en cualquier lugar, incluso en cajas compartidas; establecer la ruta de inclusión requiere un poco más de pensamiento y esfuerzo, pero como he mencionado le permite empezar a usar __autoload que acaba el más fresco.

3

Otra opción, en relación con Kevin, es utilizar __FILE__, sino que reemplazar el nombre del archivo php desde dentro de ella:

<?php 

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__); 
require_once($docRoot . '/lib/include.php'); 

?> 

He estado usando esto por un tiempo. El único problema es que a veces no se tiene $_SERVER['SCRIPT_NAME'], pero a veces hay otra parecida variable.

4

Otra forma de manejar esto que elimina la necesidad de incluir en absoluto es utilizar la función autoload. Incluir todo lo que su script necesita "Just in Case" puede impedir el rendimiento.Si sus includes son todas las definiciones de clase o interfaz, y desea cargarlas solo cuando sea necesario, puede sobrecargar la función __autoload() con su propio código para encontrar el archivo de clase apropiado y cargarlo solo cuando se lo llame. Aquí está el ejemplo del manual:

function __autoload($class_name) { 
    require_once $class_name . '.php'; 
} 

$obj = new MyClass1(); 
$obj2 = new MyClass2(); 

Mientras que establecer las variables de include_path en consecuencia, que no será necesario incluir un archivo de clase de nuevo.

3

¡Me pareció que funcionaba muy bien!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1))); 
} 

Uso:

<?php 

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1))); 
} 

include(findRoot() . 'Post.php'); 
$posts = getPosts(findRoot() . 'posts_content'); 

include(findRoot() . 'includes/head.php'); 

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) { 
    $posts[$i]->displayArticle(); 
} 

include(findRoot() . 'includes/footer.php'); 

?> 
2
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php"); 

yo uso esta línea de código. Vuelve a la "parte superior" del árbol del sitio, luego va al archivo deseado.

Por ejemplo, digamos que tengo este árbol de archivos:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
dominio. com/_resources/functions.php

puedo incluir el archivo functions.php desde donde quiera que esté, con sólo pegar copia

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php"); 

Si necesita utilizar este código muchas veces, puede crear una función que devuelva la parte str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)). Luego solo inserta esta función en el primer archivo que incluyas. Tengo un archivo "initialize.php" que incluyo en la parte superior de cada página php y que contiene esta función. La próxima vez que tenga que incluir archivos, i, de hecho, sólo tiene que utilizar la función (llamado path_back):

require(path_back()."/_resources/another_php_file.php"); 
0

un camino más corto

include($_SERVER['DOCUMENT_ROOT']."/inc/include1.php"); 

'DOCUMENT_ROOT': El directorio raíz del documento en virtud del cual el script actual está ejecutando , como se define en el archivo de configuración del servidor.

Cuestiones relacionadas