2011-12-02 26 views
12

Si uso rutas absolutas, no puedo mover todo el directorio a una nueva ubicación. Si uso rutas relativas, no puedo mover archivos individuales a nuevas ubicaciones.Vías absolutas vs. relativas

¿Cuál es la solución aquí? ¿Configura un archivo de configuración que contiene la ruta raíz e ir desde allí? ¿O tienes una regla como: nunca muevas archivos?

He visto en algunos proyectos que las personas usan dirname (FILE). ¿Cuál es el sentido de eso, quiero decir, por qué no simplemente dejarlo fuera dado que el nombre de directorio es relativo de todos modos (dependiendo de dónde se encuentre el archivo)?

+0

El uso de 'dirname (__FILE __) 'o' __DIR__' es que incluso cuando el archivo está incluido, seguirá devolviendo el directorio del script actual. Si tiene un archivo que incluye dir/script.php, la ruta de inclusión predeterminada en script.php será la raíz y no dir /. – Kokos

+1

@Frank Vilea: * ¿Configurar un archivo de configuración que contenga la ruta raíz e ir desde allí? * ** sí ** –

+0

Soy bastante malo conmigo mismo, pero supongo que la idea es mezclar esos dos. Bu agregando una ruta absoluta a las rutas de acceso principal y relativa al archivo incluido y utilizado en el script. por supuesto, nunca puede mover ninguno de los archivos usando una ruta relativa sin cambiar algo en la declaración de ruta relativa. – OptimusCrime

Respuesta

14

se debe utilizar un archivo de configuración que se incluye en cada archivo de primera línea, por ejemplo, su aplicación se parece a esta raíz

/app/plugins

dentro de su directorio raíz: app-config.php

if (!defined('ABSPATH')) 
    define('ABSPATH', dirname(__FILE__) . '/'); 

ahora, supongamos que usted tiene que incluir un archivo plugin, por lo

dentro de su dir Plugin: my-plugin.php

require_once '../../app-config.php'; 

ahora todo debajo de esta línea se puede utilizar ABSPATH

ejemplo, ¿desea cargar una imagen

<img src='".ABSPATH."Public/images/demo.png' alt=''/> 

ahora, la cosa es más sencilla si su aplicación está diseñada para cargar automáticamente algunos archivos como

plugin-widget-1.php 

para que todo el interior de este archivo o cualquier otro archivo cargado por el archivo my-plugin.php puede usar el ABSPATH sin incluir cada vez el archivo app-config.php.

con esto en mente, usted puede tener toda la taquigrafía que desee en el ejemplo app-config.php

define('UPLOAD_PATH', ABSPATH. 'Public/uploads/'); 
define('IMAGES_PATH', ABSPATH. 'Public/images/'); 
define('HELPERS_PATH', ABSPATH. 'App/helpers/'); 
... 

así, ahora que todos ustedes se han definido, si necesita mover un archivo, digamos una carpeta ejemplo a seguir:

root/app/plugins/Utilidades

simplemente inlucde require_once '../../../app-config.php';

obviamente supongo tha t no está cambiando las rutas cada vez =) de todos modos, si necesita hacerlo, siempre es más fácil cambiar una inclusión de archivo en lugar de cientos.

esperanza de que esto tiene sentido para ti =)

+0

Estoy implementando esta solución en este momento. Gracias. –

1

depende de su uso, definir una constante para mantener ruta de la aplicación es una de la práctica común

No utilice variable, ya que puede ser que consiga anular algún lugar de su aplicación y puede romper su aplicación

Es aún mejor para combinar con enlace simbólico (simbólico para crear ramas)

application dirs 
=============================== 
/home/latest   -> symlink 
/home/testing  -> symlink 
/home/20111202000000 -> latest development version 
/home/20111201000000 -> yesterday stable release 

lo tanto, puede enlace simbólico
/home/prueba ->/home/20111202000000 mientras se mantiene la estabilidad ver sión,
/home/Latest ->/home/20111201000000

Con esto, usted no tiene que el riesgo de romper su sitio de producción, mientras que hacer algunas pruebas/desarrollo, y, se puede cambiar fácilmente su directorio de desarrollo

+0

Realmente me gusta esta solución. Nunca pensé en usar enlaces simbólicos. –

2

He visto en algunos proyectos que la gente usa dirname (FILE). ¿Cuál es el sentido de eso, quiero decir, por qué no simplemente dejarlo fuera dado que el nombre de directorio es relativo de todos modos (dependiendo de dónde se encuentre el archivo)?

Es relativo a la ruta de inclusión, de todos modos. El dirname(__FILE__) (o simplemente __DIR__ en PHP> = 5.3) está allí para que pueda ejecutar el archivo desde cualquier ubicación. En caso de que esté utilizando rutas relativas, el valor "." podría cambiar. Ver:

baya baya @-pc: ~% gato so.php

<?php 
var_dump(realpath('.')); 
var_dump(realpath(__DIR__)); 

baya baya @-pc: ~% php so.php

string(11) "/home/berry" 
string(11) "/home/berry" 

baya @ berry-pc: ~% cd foo

berry @ berry-pc: ~/foo% php .. /so.php

string(15) "/home/berry/foo" 
string(11) "/home/berry" 

Por lo tanto, es relativo, pero es relativa al directorio de trabajo actual, no al directorio del archivo se encuentra en. Es por eso que usted desea utilizar para este __DIR__. Y por cierto; sí, no muevo archivos por mucho. Si lo hago, tendré que actualizar cada llamada a ese archivo, aunque ya no necesito ni incluyo mucho, ya que estoy usando un Autoloader.

En cuanto a los otros archivos que me refiero (como archivos de plantilla), establecí la ruta manualmente, pero una vez. Luego me refiero al $path . '/filename.php';, por lo que es más fácil cambiarlo más tarde.

+2

Gracias por esta publicación muy detallada. Ahora tiene sentido. Además, la función de autocarga parece muy ordenada. –

+0

@FrankVilea Muy bienvenido. –

0

Las rutas absolutas son mejores desde el punto de vista del rendimiento cuando se utiliza una caché de código de operación o muchas instrucciones de inclusión/inclusión (aunque solo se nota cuando se incluyen cientos de archivos, como podría ocurrir al usar un framework como Zend/Symfony/etc).

Con una ruta relativa, la caché del código de operación y php deben calcular los archivos en tiempo real cada vez antes de que pueda funcionar si ya sabe sobre el archivo y si necesita cargarlo nuevamente. PHP mantiene internamente un hashmap de archivos en ubicaciones de archivos, que es muy rápido siempre que no tenga que hacer el cálculo anterior cada vez.

0

siempre uso rutas absolutas, sino también de empezar cualquier proyecto PHP personalizado con un archivo de arranque en el que definir las rutas más utilizadas como constantes, sobre la base de los valores extraídos de $_SERVER.

Esto es como defino mis caminos raíz:

define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); 
define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); 

LOCAL_PATH_ROOT El camino es la raíz del documento. La ruta HTTP_PATH_ROOT es el equivalente cuando se accede a la misma ruta a través de HTTP.

En ese punto, la conversión de cualquier ruta de acceso local a una ruta de acceso HTTP se puede hacer con el siguiente código:

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path) 

Si desea asegurar la compatibilidad con los servidores basados ​​en Windows, tendrá que reemplazar el directorio separador con un separador URL así:

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path)) 

Aquí está el código de arranque completo que estoy usando para el PHP PowerTools boilerplate:

defined('LOCAL_PATH_BOOTSTRAP') || define("LOCAL_PATH_BOOTSTRAP", __DIR__); 

// ----------------------------------------------------------------------- 
// DEFINE SEPERATOR ALIASES 
// ----------------------------------------------------------------------- 
define("URL_SEPARATOR", '/'); 
define("DS", DIRECTORY_SEPARATOR); 
define("PS", PATH_SEPARATOR); 
define("US", URL_SEPARATOR); 

// ----------------------------------------------------------------------- 
// DEFINE ROOT PATHS 
// ----------------------------------------------------------------------- 
define("RELATIVE_PATH_ROOT", ''); 
define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); 
define("HTTP_PATH_ROOT", 
     isset($_SERVER["HTTP_HOST"]) ? 
     $_SERVER["HTTP_HOST"] : (
     isset($_SERVER["SERVER_NAME"]) ? 
     $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); 

// ----------------------------------------------------------------------- 
// DEFINE RELATIVE PATHS 
// ----------------------------------------------------------------------- 
define("RELATIVE_PATH_BASE", 
     str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd())); 
define("RELATIVE_PATH_APP", dirname(RELATIVE_PATH_BASE)); 
define("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP . DS . 'vendor'); 
define("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE); 
define("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE . DS . 'templates'); 
define("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE . DS . 'config'); 
define("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE . DS . 'pages'); 
define("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE . DS . 'assets'); 
define("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET . DS . 'img'); 
define("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET . DS . 'css'); 
define("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET . DS . 'js'); 

// ----------------------------------------------------------------------- 
// DEFINE LOCAL PATHS 
// ----------------------------------------------------------------------- 
define("LOCAL_PATH_BASE", LOCAL_PATH_ROOT . RELATIVE_PATH_BASE); 
define("LOCAL_PATH_APP", LOCAL_PATH_ROOT . RELATIVE_PATH_APP); 
define("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT . RELATIVE_PATH_LIBRARY); 
define("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT . RELATIVE_PATH_HELPERS); 
define("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT . RELATIVE_PATH_TEMPLATE); 
define("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT . RELATIVE_PATH_CONFIG); 
define("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT . RELATIVE_PATH_PAGES); 
define("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET); 
define("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_IMG); 
define("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_CSS); 
define("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_JS); 

// ----------------------------------------------------------------------- 
// DEFINE URL PATHS 
// ----------------------------------------------------------------------- 
if (US === DS) { // needed for compatibility with windows 
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT . RELATIVE_PATH_BASE); 
    define("HTTP_PATH_APP", HTTP_PATH_ROOT . RELATIVE_PATH_APP); 
    define("HTTP_PATH_LIBRARY", false); 
    define("HTTP_PATH_HELPERS", false); 
    define("HTTP_PATH_TEMPLATE", false); 
    define("HTTP_PATH_CONFIG", false); 
    define("HTTP_PATH_PAGES", false); 
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET); 
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_IMG); 
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_CSS); 
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_JS); 
} else { 
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_BASE)); 
    define("HTTP_PATH_APP", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_APP)); 
    define("HTTP_PATH_LIBRARY", false); 
    define("HTTP_PATH_HELPERS", false); 
    define("HTTP_PATH_TEMPLATE", false); 
    define("HTTP_PATH_CONFIG", false); 
    define("HTTP_PATH_PAGES", false); 
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET)); 
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET_IMG)); 
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET_CSS)); 
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET_JS)); 
} 

// ----------------------------------------------------------------------- 
// DEFINE REQUEST PARAMETERS 
// ----------------------------------------------------------------------- 
define("REQUEST_QUERY", 
     isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] != '' ? 
     $_SERVER["QUERY_STRING"] : false); 
define("REQUEST_METHOD", 
     isset($_SERVER["REQUEST_METHOD"]) ? 
     strtoupper($_SERVER["REQUEST_METHOD"]) : false); 
define("REQUEST_STATUS", 
     isset($_SERVER["REDIRECT_STATUS"]) ? 
     $_SERVER["REDIRECT_STATUS"] : false); 
define("REQUEST_PROTOCOL", 
     isset($_SERVER["HTTP_ORIGIN"]) ? 
     substr($_SERVER["HTTP_ORIGIN"], 0, 
     strpos($_SERVER["HTTP_ORIGIN"], '://') + 3) : 'http://'); 
define("REQUEST_PATH", 
     isset($_SERVER["REQUEST_URI"]) ? 
     str_replace(RELATIVE_PATH_BASE, '', 
     $_SERVER["REQUEST_URI"]) : '_UNKNOWN_'); 
define("REQUEST_PATH_STRIP_QUERY", 
     REQUEST_QUERY ? 
     str_replace('?' . REQUEST_QUERY, '', REQUEST_PATH) : REQUEST_PATH); 

// ----------------------------------------------------------------------- 
// DEFINE SITE PARAMETERS 
// ----------------------------------------------------------------------- 
define("PRODUCTION", false); 
define("PAGE_PATH_DEFAULT", US . 'index'); 
define("PAGE_PATH", 
     (REQUEST_PATH_STRIP_QUERY === US) ? 
     PAGE_PATH_DEFAULT : REQUEST_PATH_STRIP_QUERY); 

Si se agrega el código anterior para su propio proyecto, dar salida a todas las constantes de usuario en este momento (que se puede ver con get_defined_constants(true) debe dar un resultado que se ve algo como esto:

array (
    'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples', 
    'URL_SEPARATOR' => '/', 
    'DS' => '/', 
    'PS' => ':', 
    'US' => '/', 
    'RELATIVE_PATH_ROOT' => '', 
    'LOCAL_PATH_ROOT' => '/var/www', 
    'HTTP_PATH_ROOT' => 'localhost:8888', 
    'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples', 
    'RELATIVE_PATH_APP' => '/libraries/backend/Data', 
    'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor', 
    'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples', 
    'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates', 
    'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config', 
    'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages', 
    'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets', 
    'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img', 
    'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css', 
    'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js', 
    'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples', 
    'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data', 
    'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor', 
    'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples', 
    'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates', 
    'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config', 
    'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages', 
    'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets', 
    'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img', 
    'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css', 
    'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js', 
    'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples', 
    'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data', 
    'HTTP_PATH_LIBRARY' => false, 
    'HTTP_PATH_HELPERS' => false, 
    'HTTP_PATH_TEMPLATE' => false, 
    'HTTP_PATH_CONFIG' => false, 
    'HTTP_PATH_PAGES' => false, 
    'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets', 
    'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img', 
    'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css', 
    'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js', 
    'REQUEST_QUERY' => false, 
    'REQUEST_METHOD' => 'GET', 
    'REQUEST_STATUS' => false, 
    'REQUEST_PROTOCOL' => 'http://', 
    'REQUEST_PATH' => '/', 
    'REQUEST_PATH_STRIP_QUERY' => '/', 
    'PRODUCTION' => false, 
    'PAGE_PATH_DEFAULT' => '/index', 
    'PAGE_PATH' => '/index', 
) 
Cuestiones relacionadas