php qu茅 - Obtener ruta absoluta de la secuencia de comandos actual




ejemplo acceso (14)

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__ );
}

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.


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'])

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.


`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.


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.


Sólo use a continuación:

echo __DIR__;

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.


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/  

__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'];

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!


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\


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']);
}

Un trazador de líneas

`dirname $(realpath $0)`




php path include