2010-02-21 12 views
7

Para mantener el funcionamiento de las URL en los proyectos controlados por versiones, he estado usando $ _SERVER ['RAÍZ_DOCUMENTOS']. El problema es que desarrollo proyectos dentro de una carpeta, así que obtengo esto:¿Cómo puedo controlar DOCUMENT_ROOT para que funcione en el servidor local y el servidor en vivo?

$ _SERVER ['DOCUMENT_ROOT']. '/folder/path/to/file.php'

Cuando voy en vivo, por lo general sólo quiero lo siguiente:

$ _SERVER [ 'DOCUMENT_ROOT']. '/path/to/file.php'

Sé que hay problemas más grandes en el mundo que tener que eliminar y agregar este nombre de carpeta, pero ¿hay alguna manera de automatizarlo fácilmente? ¿De alguna manera puedo configurar mi raíz de documento localmente para incluir la carpeta en la que estoy trabajando? ¿Tengo un malentendido fundamental sobre la forma en que funcionan las cosas? Algo nuevo en estas cosas, y busca aprender tanto como sea posible y realmente asimilar el "por qué".

¡Muchas gracias!

Respuesta

10

En lugar de usar $_SERVER['DOCUMENT_ROOT'], ¿por qué no declarar una constante que siempre contiene la raíz de su aplicación web?

<?php 
define('ABSPATH', dirname(__FILE__)); 

poner el código siguiente en un archivo que se encuentra en la carpeta raíz de la aplicación y deben incluirse en cada carga de página.

Luego, simplemente siempre puede hacer $path = ABSPATH . '/path/to/file.php'; independientemente de si su copia local está en un subdirectorio folder o no.


Si su aplicación ya tiene un archivo que se incluye en cada carga de página, sólo tiene que colocar el código anterior en ese archivo y funcionará.

Solo tenga en cuenta que puede que tenga que agregar llamadas adicionales dirname() dependiendo de dónde se encuentre ese archivo. Agregue uno para cada directorio que pase desde la raíz de su aplicación web.

Por ejemplo, si su aplicación Web se encuentra en /webapp/ y su "Include global" se encuentra en /webapp/includes/framework/init.php, a continuación, el código anterior tiene que ser modificado como tal:

define('ABSPATH', dirname(dirname(dirname(__FILE__)))); 

es decir .: 2 dirname() llamadas adicionales debido a dos carpetas adicionales a partir de la raíz webapp (includes/framework)


Aclaración

El código anterior está destinado a estar en un archivo y un archivo solo en su aplicación web. Ese archivo debe incluirse en cada carga de página.

Si ya tiene un archivo que se incluye antes de cualquier proceso (como un archivo de configuración u otro), puede copiar y pegar ese código en ese archivo.

El número de llamadas dirname() depende de la profundidad del archivo que ha copiado y pegado el código en es relativa al directorio raíz de la aplicación web. Para los ejemplos anteriores, suponga que la raíz de su aplicación web está representada por ~.

Si copia y pega mi código en ~/abspath.php, entonces necesita una llamada dirname().

Si copia y pega mi código en ~/includes/abspath.php, entonces necesita dos llamadas dirname().

Si copia y pega mi código en ~/includes/config/abspath.php, entonces necesita tres dirname() llamadas. Ahora digamos que esa es su ubicación final.

En ~/index.php, de hacer lo siguiente:

<?php 
require_once('includes/config/abspath.php'); 

y tiene acceso a ABSPATH.

En ~/dir/someOtherPage.php que hacer lo siguiente:

<?php 
require_once('../includes/config/abspath.php'); 

y tiene acceso a ABSPATH.

Es por esto que digo que si ya tiene un archivo que se incluye en cada carga de la página, su más simple sólo para soltar el código anterior en el mismo. Solo asegúrese de modificar la cantidad de llamadas dirname() en consecuencia. De nuevo, este código debe estar en SÓLO UN ARCHIVO.

+0

De acuerdo, Andrew, su método es un poco más difícil de entender al principio. Déjame comprobar que lo obtengo: ¿Cada nombre de directorio sube un nivel desde la ubicación del archivo incluido? Así que si el archivo se incluye en el lugar que estoy buscando para llegar a (myLoc), que es sólo una dirname(), pero si está en myLoc/SUB1/sub2/SUB3, entonces yo usaría nombredir (dirname (dirname (dirname (__ FILE__))));? Entonces, esencialmente, ¿la cantidad de dirnames me permite siempre comenzar desde la ubicación de la que quiero partir para ABSPATH? –

+0

Esto funcionó muy bien; muchas gracias por la solución perfecta, Andrew. –

+0

Genial. Lo incluí en un archivo constante que se requiere dentro de mi encabezado, que está incluido en cada página. Funciona muy bien en dev, y espero que funcione perfectamente en producción; a punto de svn hasta allí. –

1

declaran por debajo de la línea en cualquiera de raíz archivo (index.php)

$_SESSION["uploads_base_url"]=dirname(__FILE__); 

y ahora se puede utilizar esto en cualquiera de las subidas de archivos donde se necesitan.

echo $uploads_base_url=$_SESSION["uploads_base_url"]; 
Cuestiones relacionadas