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.