2010-10-17 35 views
22

Tengo problemas con mis archivos de inclusión. No parece poder descifrar cómo construir mis URL cuando uso require_once ('somefile.php'). Si trato de usar un archivo de inclusión en más de un lugar donde las estructuras del directorio son diferentes, aparece un error que indica que no se puede encontrar el archivo de inclusión.PHP ¿cómo encontrar la raíz de la aplicación?

En asp.net, para obtener mi ruta de acceso a la raíz de la aplicación, puedo usar ~/directory/file.aspx. La barra inclinada tild siempre sabe que estoy haciendo una referencia desde la raíz de mi sitio web y encuentro el archivo sin importar de dónde proviene la solicitud dentro de mi sitio web. Siempre se refiere a la raíz y busca el archivo desde allí.

PREGUNTA: ¿Cómo puedo obtener la ruta de acceso de mi sitio? ¿Cómo puedo hacer esto para poder reutilizar mis archivos de inclusión desde cualquier parte de mi sitio? ¿Tengo que usar rutas absolutas en mis URL?

¡Gracias!

+2

URL que construyen no tienen nada que ver con require_once URL no es un archivo ¡es cosa del protocolo HTTP, no del sistema de ficheros –

+0

¿Qué versión de PHP está utilizando y cómo es su estructura de sistema de archivos? – Petah

Respuesta

20

Hay $_SERVER['DOCUMENT_ROOT'] que debe tener la ruta de acceso de la raíz a su servidor web.

Editar: Si nos fijamos en la mayoría de los principales programas de php. Cuando utiliza el instalador, generalmente ingresa en la ruta completa a la carpeta de la aplicación. El instalador simplemente pondrá eso en un archivo de configuración que se incluye en toda la aplicación. Una opción es usar un auto prepend file para establecer la variable. otra opción es simplemente include_once() el archivo de configuración en cada página que lo necesite. La última opción que sugeriría es escribir su solicitud usando bootstrapping que es donde canaliza todas las solicitudes a través de un archivo (generalmente con url_rewrite). Esto le permite establecer/incluir variables de configuración fácilmente en un solo lugar y tenerlas disponibles en todos los scripts.

+0

En mi máquina de desarrollo usi ng WampServer Obtengo C:/wamp/www/cuando uso $ _SERVER ['DOCUMENT_ROOT']. Mi sitio, sin embargo, se encuentra en C:/wamp/www/mysite /. Si mi sitio estaba alojado en un servidor en vivo como un host compartido, ¿qué obtendría al usar $ _SERVER ['DOCUMENT_ROOT']? –

+0

es mysite un host virtual? – koen

+1

Esto sucede porque la raíz de la aplicación real es C:/wamp/www y usted aloja el código en un subdirectorio de esto. Es posible que desee cambiar la raíz del documento para este proyecto o crear una variable (const MY_APP_ROOT = ... –

-2

Prueba esto:

$_SERVER['DOCUMENT_ROOT'] 
+0

No, el OP está buscando la URL base, no la ruta del archivo –

+1

@Scott De hecho, el único uso de esta variable es cargar archivos de inclusión –

+0

Correcto: funciona bien, aquí – winwaed

-1

debería utilizar el construido en constantes mágicas para encontrar archivos. __FILE__ y __DIR__. Si está en PHP < 5.3, debe usar dirname(__FILE__)

E.g.

require_once __DIR__.'/../../include_me.php'; 

$_SERVER['DOCUMENT_ROOT'] no siempre está garantizado para devolver lo que cabría esperar.

+0

esto no funcionará en subdirectorios –

+0

¿Por qué no funcionaría en subdirectores? 'require_once __DIR__. '/ i/am/a/sub/dir.php' – Petah

+0

Lamentablemente, ninguna de estas soluciones parece funcionar. $ _SERVER ['DOCUMENT_ROOT'] es lo más cercano a las soluciones, pero no incluye archivos. –

-1

Defina en algún lugar un archivo de configuración.

Suponiendo que estés usando un estilo MVC, donde todo se encamina a través de un único index.php entonces

realpath('.'); 

le mostrará la ruta de acceso al directorio de trabajo actual (es decir, donde el índice.PHP es)

Entonces se puede definir esto como

define('PROJECT_ROOT', realpath('.')); 

Si no es MVC y lo necesita para trabajar para los archivos de las subcarpetas entonces se puede código sólo difícil que en un archivo de configuración

define('PROJECT_ROOT', 'C:/wamp/www/mysite'); 

Luego, cuando se incluye algo que puede hacer;

include PROJECT_ROOT . '/path/to/include.php'; 
-1

Usted podría Alternativly establecer el directorio base en su archivo .htaccess

SetEnv BASE_PATH C:/wamp/www/mysite/ 

Luego, en PHP que puede hacer referencia a ella con $_SERVER['BASE_PATH']

+0

¿Por qué todo el odio? – Petah

8

que suelo guardar config.php archivo en directorio raíz, y en config.php Escribo:

define('ROOT_DIR', __DIR__);

Y luego solo use ROOT_DIR constante en todas las demás secuencias de comandos. Usando $_SERVER['DOCUMENT_ROOT'] no es muy bueno porque:

  • No siempre juego ROOT_DIR
  • Esta variable no está disponible en CGI modo (por ejemplo, si ejecuta las secuencias de comandos por CRON)
+4

para usar constante ROOT_DIR en todos los demás scripts, debe incluir un archivo que lo contenga en todos los demás scripts. Entonces, el mismo problema otra vez. –

+1

Sí, pero al menos puede usar: include (ROOT_DIR. '/ Known/path/to/file.php'); En lugar de usar algo como: $ ROOT = '../../../'; (que tiene que cambiar en cada subdirectorio), pero luego debe preocuparse de globalizar $ ROOT todo el tiempo. – AVProgrammer

+0

Creo que es una buena forma de $ _Server array – HAROONMIND

0

Es agradable poder usar el mismo código en la parte superior de cada script y saber que su página se cargará correctamente, incluso si se encuentra en un subdirectorio. Yo uso este, que se basa en que saber cuál es su directorio raíz se llama (por lo general, 'htdocs' o 'public_html':

defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html'); 

Con SITEROOT definido reiteradamente, a continuación, puede acceder a un archivo de configuración y/o componentes de la página sin adaptar caminos sobre una base por ejemplo, la escritura-por-script a un archivo de configuración almacenado fuera de la carpeta raíz:..

require_once SITEROOT . "/../config.php"; 
Cuestiones relacionadas