una rutas ruta relativas relativa qué que obtener ejercicios ejemplos ejemplo completa archivo acceso absolutas absoluta php path include

php - rutas - ruta de acceso ejemplo



Obtener ruta absoluta de la secuencia de comandos actual (16)

He buscado alto y bajo y obtengo muchas soluciones y variables diferentes que contienen información para obtener la ruta absoluta. Pero parecen funcionar en algunas condiciones y no en otras. ¿Hay una manera de obtener el camino absoluto del script ejecutado en PHP? Para mí, el script se ejecutará desde la línea de comandos, pero una solución debería funcionar igual de bien si se ejecuta dentro de Apache, etc.

Aclaración: el script ejecutado inicialmente, no necesariamente el archivo donde se codifica la solución.


Aquí hay una función PHP útil que escribí para esto precisamente. Como se aclara la pregunta original, devuelve la ruta desde la que se ejecutó el script inicial , no el archivo en el que estamos actualmente.

/** * Get the file path/dir from which a script/function was initially executed * * @param bool $include_filename include/exclude filename in the return string * @return string */ function get_function_origin_path($include_filename = true) { $bt = debug_backtrace(); array_shift($bt); if ( array_key_exists(0, $bt) && array_key_exists(''file'', $bt[0]) ) { $file_path = $bt[0][''file'']; if ( $include_filename === false ) { $file_path = str_replace(basename($file_path), '''', $file_path); } } else { $file_path = null; } return $file_path; }


Ejemplos para: https://(www.)example.com/subFolder/yourfile.php?var=blabla#555

//=================================================== //========== self-defined SERVER variables ========== //=================================================== $_SERVER["DOCUMENT_ROOT"] 🡺 /home/user/public_html $_SERVER["SERVER_ADDR"] 🡺 143.34.112.23 $_SERVER["SERVER_PORT"] 🡺 80(or 443 etc..) $_SERVER["REQUEST_SCHEME"] 🡺 https //like: $_SERVER["SERVER_PROTOCOL"] $_SERVER[''HTTP_HOST''] 🡺 example.com //like: $_SERVER["SERVER_NAME"] $_SERVER["REQUEST_URI"] 🡺 /subFolder/yourfile.php?var=blabla $_SERVER["QUERY_STRING"] 🡺 var=blabla __FILE__ 🡺 /home/user/public_html/subFolder/yourfile.php __DIR__ 🡺 /home/user/public_html/subFolder //like: dirname(__FILE__) $_SERVER["REQUEST_URI"] 🡺 /subFolder/yourfile.php?var=blabla parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺 /subFolder/yourfile.php $_SERVER["PHP_SELF"] 🡺 /subFolder/yourfile.php // ================================================================== //if "YOURFILE.php" is included in "PARENTFILE.php" , and you visit "PARENTFILE.PHP?abc": $_SERVER["SCRIPT_FILENAME"]🡺 /home/user/public_html/parentfile.php $_SERVER["PHP_SELF"] 🡺 /parentfile.php $_SERVER["REQUEST_URI"] 🡺 /parentfile.php?abc __FILE__ 🡺 /home/user/public_html/subFolder/yourfile.php // =================================================== // ============== PARSE_URL & PATHINFO ============== // =================================================== //parse_url $x = parse_url($url); $x[''scheme''] 🡺 https $x[''host''] 🡺 example.com $x[''path''] 🡺 /subFolder/yourfile.php $x[''query''] 🡺 var=blabla $x[''fragment''] 🡺 555 // hashtag outputed only in case, when hashtag-containing string was manually passed to function, otherwise PHP is unable to recognise hashtags in $_SERVER //pathinfo (If you will ever use this function, I only recommend to pass `parse_url`s output as argument) A = pathinfo($url); B = pathinfo(parse_url($url)[''path'']); A[''dirname''] 🡺 https://example.com/subFolder B[''dirname''] 🡺 /subFolder A[''basename''] 🡺 yourfile.php?var=blabla#555 B[''basename''] 🡺 yourfile.php A[''extension''] 🡺 php?var=blabla#555 B[''extension''] 🡺 php A[''filename''] 🡺 yourfile B[''filename''] 🡺 yourfile // =================================================== // ================= handy variables ================= // =================================================== //If site uses HTTPS: $HTTP_or_HTTPS = ((!empty($_SERVER[''HTTPS'']) && $_SERVER[''HTTPS'']!==''off'') || $_SERVER[''SERVER_PORT'']==443) ? ''https://'':''http://'' ); //in some cases, you need to add this condition too: if (''https''==$_SERVER[''HTTP_X_FORWARDED_PROTO'']) ... //To trim values to filename, i.e. basename($url) 🡺 yourfile.php //excellent solution to find origin $debug_files = debug_backtrace(); $initial_called_file = count($debug_files) ? $debug_files[count($debug_files) - 1][''file''] : __FILE__;

¡Darse cuenta!:

  • hashtag (# ...) Las partes de la URL no se pueden detectar desde PHP (lado del servidor). Para eso, usa JavaScript.
  • DIRECTORY_SEPARATOR devuelve / para alojamiento de tipo Windows, en lugar de / .


Para WordPress

//(let''s say, if wordpress is installed in subdirectory: http://example.com/wpdir/) home_url() 🡺 http://example.com/wpdir/ //if is_ssl() is true, then it will be "https" get_stylesheet_directory_uri() 🡺 http://example.com/wpdir/wp-content/themes/THEME_NAME [same: get_bloginfo(''template_url'') ] get_stylesheet_directory() 🡺 /home/user/public_html/wpdir/wp-content/themes/THEME_NAME plugin_dir_url(__FILE__) 🡺 http://example.com/wpdir/wp-content/themes/PLUGIN_NAME plugin_dir_path(__FILE__) 🡺 /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/


En caso de usar framework, la mayoría de ellos no funciona, así que he encontrado la solución para eso. Código:

echo dirname(__FILE__).''//'.basename(__FILE__);

Debe dar la ruta absoluta, incluido el nombre del archivo.


Esto es lo que uso y funciona en entornos Linux. No creo que esto funcione en una máquina con Windows ...

//define canonicalized absolute pathname for the script if(substr($_SERVER[''SCRIPT_NAME''],0,1) == DIRECTORY_SEPARATOR) { //does the script name start with the directory separator? //if so, the path is defined from root; may have symbolic references so still use realpath() $script = realpath($_SERVER[''SCRIPT_NAME'']); } else { //otherwise prefix script name with the current working directory //and use realpath() to resolve symbolic references $script = realpath(getcwd() . DIRECTORY_SEPARATOR . $_SERVER[''SCRIPT_NAME'']); }


La forma más fácil de recuperar la ruta absoluta del script ejecutado inicialmente desde ese script "principal" y cualquier script incluido con include , require , require_once es almacenándolo en una constante al comienzo del script principal:

define( ''SCRIPT_ROOT'', __FILE__ );

__FILE__ devuelve la ruta del script actual. Usado dentro de una secuencia de comandos incluida, devuelve la ruta del archivo incluido , no la secuencia de comandos que se ejecuta inicialmente como el OP solicita:

Aclaración: el script inicial ejecutado, no el archivo en el que estamos actualmente

La solución de almacenar __FILE__ en una constante es más fácil y más rápida que recuperar la ruta usando debug_backtrace()

La solución anterior es adecuada cuando hay un solo script "principal" que include todos los demás scripts necesarios, como en la mayoría de las aplicaciones web.

Si ese no es el caso y puede haber varios "scripts iniciales", entonces para evitar redefiniciones y tener la ruta correcta almacenada dentro de la constante con la que cada script puede comenzar:

if( ! defined( ''SCRIPT_ROOT'' ) ) { define( ''SCRIPT_ROOT`, __FILE__ ); }


Sólo use a continuación:

echo __DIR__;


Si desea obtener el directorio de trabajo actual use getcwd()

http://php.net/manual/en/function.getcwd.php

__FILE__ devolverá la ruta con el nombre de archivo, por ejemplo, en XAMPP C:/xampp/htdocs/index.php lugar de C:/xampp/htdocs/


Si está buscando la ruta absoluta relativa a la raíz del servidor, he encontrado que esto funciona bien:

$_SERVER[''DOCUMENT_ROOT''] . dirname($_SERVER[''SCRIPT_NAME''])


prueba esto en tu guión

echo getcwd() . "/n";


__FILE__ constante __FILE__ le dará una ruta absoluta al archivo actual.

Actualización :

Se cambió la pregunta para preguntar cómo recuperar el script ejecutado inicialmente en lugar del script actualmente en ejecución. La única forma confiable (??) de hacerlo es usar la función debug_backtrace .

$stack = debug_backtrace(); $firstFrame = $stack[count($stack) - 1]; $initialFile = $firstFrame[''file''];


La solución correcta es usar la función get_included_files :

list($scriptPath) = get_included_files();

Esto le dará la ruta absoluta del script inicial incluso si:

  • Esta función se coloca dentro de un archivo incluido.
  • El directorio de trabajo actual es diferente del directorio del script inicial.
  • El script se ejecuta con el CLI, como una ruta relativa

Aquí hay dos scripts de prueba; El script principal y un archivo incluido:

# C:/Users/Redacted/Desktop/main.php include __DIR__ . DIRECTORY_SEPARATOR . ''include.php''; echoScriptPath(); # C:/Users/Redacted/Desktop/include.php function echoScriptPath() { list($scriptPath) = get_included_files(); echo ''The script being executed is '' . $scriptPath; }

Y el resultado; note el directorio actual:

C:/>php C:/Users/Redacted/Desktop/main.php The script being executed is C:/Users/Redacted/Desktop/main.php


__DIR__

Del manual :

El directorio del archivo. Si se utiliza dentro de una inclusión, se devuelve el directorio del archivo incluido. Esto es equivalente a dirname(__FILE__) . Este nombre de directorio no tiene una barra inclinada a menos que sea el directorio raíz.
__FILE__ siempre contiene una ruta absoluta con los enlaces simbólicos resueltos, mientras que en versiones anteriores (que 4.0.2) contenía una ruta relativa en algunas circunstancias.

Nota : __DIR__ fue agregado en PHP 5.3.0.


`realpath(dirname(__FILE__))`

le proporciona el directorio actual del script (el script dentro del cual colocó este código) sin una barra diagonal al final. Esto es importante si desea incluir otros archivos con el resultado.


dirname(__FILE__)

proporcionará la ruta absoluta del archivo actual desde el cual está solicitando la ruta, la ruta del directorio de su servidor.

archivos de ejemplo:

www / http / html / index.php; Si coloca este código dentro de su index.php, regresará:

<?php echo dirname(__FILE__); // this will return: www/http/html/

www / http / html / class / myclass.php; Si coloca este código dentro de su myclass.php, devolverá:

<?php echo dirname(__FILE__); // this will return: www/http/html/class/


echo realpath(dirname(__FILE__));

Si coloca esto en un archivo incluido, imprime la ruta a este incluir. Para obtener la ruta del script principal, reemplace __FILE__ con $_SERVER[''PHP_SELF''] . ¡Pero tenga en cuenta que PHP_SELF es un riesgo de seguridad!


realpath($_SERVER[''SCRIPT_FILENAME''])

Para la secuencia de comandos ejecutada en el servidor web $_SERVER[''SCRIPT_FILENAME''] contendrá la ruta completa de la secuencia de comandos inicialmente llamada, así que probablemente su index.php. No se requiere realpath() en este caso.

Para el script ejecutado desde la consola $_SERVER[''SCRIPT_FILENAME''] contendrá una ruta relativa a su script inicialmente llamado desde su directorio de trabajo actual. Entonces, a menos que haya cambiado el directorio de trabajo dentro de su script, se resolverá en la ruta absoluta.