Obtener la ruta completa... cual de estos es mejor?

Iniciado por Alex_bro, 13 Octubre 2007, 18:10 PM

0 Miembros y 1 Visitante están viendo este tema.

Alex_bro

Buenas,
ya se han escrito temas similares pero no estan totalmente completos...
Supongamos que la ruta del public_html es /home/tuweb/public_html/ y vamos a centrarnos en que tenemos un archivo 2 subdirectorios mas abajo, y necesitamos saber la ruta del public_html para incluir un archivo que esta en la raiz. Descartamos cosas como ../../ y DOCUMENT_ROOT, pues el primero no funciona en cuanto incluyes el archivo desde otro lado, y el segundo casi nunca esta definido.

Recopile 3 metodos para conseguir dicha ruta, el primero lo saque de un tema de este foro, otro del codigo fuente de SMF y otro directamente de php.net
Código (php) [Seleccionar]
str_replace("subdir/subdir/miscript.php", "", __FILE__);
Código (php) [Seleccionar]
dirname(dirname(__FILE__));
Código (php) [Seleccionar]
realpath("../../");
Luego ya pondriamos un IF para saber si la variable de la ruta esta definida, sino la definiriamos con alguno de estos metodos (alguna idea mejor?).

Mi pregunta seria... cual de estos 3 seria el mas limpio/rapido/optimo ? hay que tener en cuenta que se usaria al principio de todos los scripts, y por eso cada nanosegundo cuenta  :rolleyes:

Si alguno/a tiene idea de alguna otra forma...

Ya se que con una web modulada no haria falta nada de esto, pues ya los llamo desde un solo archivo y listo, pero para proyectos mas grandes no puedes llamarlo todo desde un fichero.

Saludos y gracias

EDITO:
Cito un comentario de php.net:
CitarThis is silly:
dirname(dirname( dirname( dirname(dirname( dirname( dirname(__FILE__))))))); // This is rediculous
       
function recursiveDirName($file, $x){
    if($x > 0) return recursiveDirName( dirname($file), $x-1 );
    return $file;
}

This is much easier:
$file = recursiveDirName(__FILE__, 7);

Que opinan sobre esto? se refiere solo a comodidad o tiene algun otro sentido?

дٳŦ٭

mm la primero no creo que sea eficiente pero para nada, la segunda menos ya que solo devuele el nombre del fichero en el que está el php y la tercera es la correcta.

Suerte


Con sangre andaluza :)


Alex_bro

Gracias por responder.
Realmente la segunda da lo mismo que la tercera, ya probe los 3 metodos en localhost y dan lo mismo.

Entonces si la primera la descartamos, cual de las otras 2 seria mas optima? o seria practicamente igual?

Otra cuestion... supongamos que usamos uno de los metodos en todos los archivos, entonces al incluir uno al otro se definiria por doble, aunque como debe de dar lo mismo no habria conflictos... que seria mejor, dejar que se vuelva a definir la variable $ruta, o usar un IF de esta forma:
Código (php) [Seleccionar]
if (!isset($ruta) {
   $ruta = METODO
}

Cuando digo que seria mejor me refiero a lo mas optimo para la carga del script, pues ya se que darian el mismo valor hiciera lo que hiciera.

Y sobre la cita que puse de php.net que opinan? yo creo que debe ser por limpieza mas que nada, pero prefiero saberlo por que en el caso de que use el segundo metodo incluir esa funcion en todos los archivos podria ser mas sucio que colocar 7 veces dirname().

Saludos y gracias de nuevo.

дٳŦ٭

#3
Miento  ;D ninguna te sirve, no había entendido la pregunta.

A ver, __FILE__ devuelve la ruta absoluta del archivo dentro del sistema, lo que necesitarías es cortar a partir del public_html/ no?, ps el document root es para eso y dificilmente se puede "no definir", de hecho me atrevería a decir que es imposible porque el apache no sabría en donde ponerte a la hora de hacer la llamada...

Pero ok, éste mundo es imperfecto así que hagamos algo:

Código (php) [Seleccionar]
<?php
$ruta
=__FILE__;
$divisor="/public_html/";
$ruta_final=explode($divisor$ruta);
echo 
$ruta_final[0].$divisor;
?>


Regresará /home/tuweb/public_html/  ;)

Suerte

EDIT

Como toy muy aburrido  :-X hasta la hago función  ;D

Código (php) [Seleccionar]

<?php
function dame_ruta($ruta,$divisor){
$ruta_final=explode($divisor$ruta);
return 
$ruta_final[0].$divisor;
}
echo 
dame_ruta(__FILE__,"/public_html/");
?>



Con sangre andaluza :)


Alex_bro

Buenas,
realmente como dices DOCUMENT_ROOT no se puede dejar sin definir, pero la mayoria lo deja en / y eso no vale de nada...

Que diferencia habria entre utilizar esa funcion con explode y el primer metodo? no haria mas carga explode?

Saludos y muchas gracias.