Pregunta

Tengo una estructura de directorios como la siguiente;

script.php

inc/include1.php
inc/include2.php

objetos/objeto1.php
objetos/objeto2.php

jabón/jabón.php

Ahora, uso esos objetos en ambos 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, los caminos absolutos 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 forma de utilizar rutas relativas o una forma de generar mediante programación el "/mnt/webdev/[project name]/"?

¿Fue útil?

Solución

Esto debería funcionar

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

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

Editar: mejora añadida por australiano

Otros consejos

Puede utilizar rutas relativas.Intentar __FILE__.Esta es una constante PHP que siempre devuelve la ruta/nombre de archivo del script en el que se encuentra.Entonces, en soap.php, Podrías hacerlo:

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

La ruta completa y el nombre de archivo del archivo.Si se usa dentro de una inclusión, 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 las versiones más antiguas contenía una ruta relativa en algunas circunstancias. (fuente)

Otra solución sería establecer un incluir ruta en su httpd.conf o en un archivo .htaccess.

Mira esto http://au.php.net/reserved.variables

Creo que la variable que estás buscando es: $_SERVER["DOCUMENT_ROOT"]

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

Otra forma de manejar esto que elimina cualquier necesidad de inclusiones es usar el carga automática característica.Incluir todo lo que su guión necesita "por si acaso" puede impedir el rendimiento.Si sus inclusiones son todas definiciones de clases o interfaces y desea cargarlas sólo cuando sea necesario, puede sobrecargar el __autoload() funcione con su propio código para encontrar el archivo de clase apropiado y cárguelo solo cuando se llame.Aquí está el ejemplo del manual:

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

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

Siempre que configure sus variables include_path en consecuencia, nunca necesitará volver a incluir un archivo de clase.

Otra opción, relacionada con la de Kevin, es utilizar __FILE__, sino que reemplaza el nombre del archivo php desde dentro de él:

<?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 tienes $_SERVER['SCRIPT_NAME'], pero a veces hay otra variable similar.

¡Descubrí que esto funciona muy bien!

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

Usar:

<?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');

?>

Creo que la mejor manera es poner tus inclusiones en tu ruta de inclusión de PHP.Hay varias formas de hacer esto dependiendo de su configuración.

Entonces puedes simplemente consultar

require_once 'inc1.php';

desde el interior de cualquier archivo, independientemente de dónde se encuentre, ya sea en sus archivos incluidos o accesibles desde la web, o en cualquier 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, consulte __autoload para la carga diferida de archivos de clase.

http://www.google.com/search?q=configuración+php+incluir+ruta

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

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 y luego va al archivo deseado.

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

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

Puedo incluir el archivo funciones.php desde donde quiera que esté, simplemente copiando y pegando

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 el str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) parte.Luego simplemente inserte esta función en el primer archivo que incluya.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, de hecho solo uso la función (llamada path_back):

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

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

Ah, sí, absolutamente.Así, por ejemplo, utilizamos una sola capa de subcarpetas, generalmente:

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

Debe tener cuidado al confiar demasiado en la ruta de inclusión en sitios con mucho tráfico, porque php tiene que buscar en el directorio actual y luego en todos los directorios en la ruta de inclusión para ver si su archivo está allí y esto puede ralentizar Las cosas cambian si te están golpeando.

Entonces, por ejemplo, si está haciendo MVC, colocaría la ruta al directorio de su aplicación en la ruta de inclusión y luego especificaría la referencia a las cosas en el formulario

'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 toda esa tontería de raíz de documentos de ruta real.

El beneficio de esas alternativas basadas en scripts que otros han sugerido es que funcionan en cualquier lugar, incluso en cajas compartidas;configurar la ruta de inclusión requiere un poco más de reflexión y esfuerzo, pero como mencioné, te permite comenzar a usar __autoload, que es lo mejor.

Si va a incluir una ruta específica en la mayoría de los archivos de su aplicación, cree una variable global en su carpeta raíz.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Ahora esta variable global "RUTA_APLICACIÓN" se puede utilizar para incluir todos los archivos en lugar de llamar a realpath() cada vez que incluye un archivo nuevo.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Espero eso ayude ;-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top