web-dev-qa-db-fra.com

Obtenir le chemin absolu du script actuel

J'ai cherché haut et bas et obtenir beaucoup de solutions différentes et de variables contenant des informations pour obtenir le chemin absolu. Mais ils semblent fonctionner dans certaines conditions et pas dans d'autres. Existe-t-il une solution miracle pour obtenir le chemin absolu du script exécuté en PHP? Pour moi, le script s'exécutera à partir de la ligne de commande, mais une solution devrait fonctionner aussi bien si elle était exécutée dans Apache, etc.

Clarification: le script initialement exécuté, pas nécessairement le fichier dans lequel la solution est codée.

236
inquam

La solution correcte consiste à utiliser la fonction get_included_files :

_list($scriptPath) = get_included_files();
_

Cela vous donnera le chemin absolu du script initial même si:

  • Cette fonction est placée dans un fichier inclus
  • Le répertoire de travail actuel est différent du répertoire du script initial
  • Le script est exécuté avec la CLI, en tant que chemin relatif

Voici deux scripts de test; le script principal et un fichier inclus:

_# 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;
}
_

Et le résultat remarquez le répertoire en cours:

_C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
_
25
Salman A

La constante ___FILE___ vous donnera le chemin absolu du fichier actuel.

Mise à jour :

La question a été modifiée pour demander comment récupérer le script initialement exécuté à la place du script en cours d'exécution. Le seul moyen (??) fiable de le faire consiste à utiliser la fonction debug_backtrace .

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

Exemples pour: https://(www.)example.com/subFolder/myfile.php?var=blabla#555

// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname']      ???? https://example.com/subFolder
$x['basename']     ????                               myfile.php?
$x['extension']    ????                                      php?k=blaa#12345 // Unsecure! also, read my notice about hashtag parts    
$x['filename']     ????                               myfile

// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme']       ???? https
$x['Host']         ????         example.com
$x['path']         ????                    /subFolder/myfile.php
$x['query']        ????                                          k=blaa
$x['fragment']     ????                                                 12345 // ! read my notice about hashtag parts

//=================================================== //
//========== 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                                         //similar: $_SERVER["SERVER_PROTOCOL"] 
$_SERVER['HTTP_Host']      ????         example.com (or with WWW)             //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"]    ????                       /subFolder/myfile.php?k=blaa
$_SERVER["QUERY_STRING"]   ????                                             k=blaa
__FILE__                   ???? /home/user/public_html/subFolder/myfile.php
__DIR__                    ???? /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    ????                       /subFolder/myfile.php?k=blaa
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)????  /subFolder/myfile.php 
$_SERVER["PHP_SELF"]       ????                       /subFolder/myfile.php

// ==================================================================//
//if "myfile.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/myfile.php

// =================================================== //
// ================= 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)             ???? myfile.php

//excellent solution to find Origin
$debug_files = debug_backtrace();       
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;

Remarquer!:

  • hashtag (# ...) Les parties de l'URL ne peuvent pas être détectées à partir de PHP (côté serveur). Pour cela, utilisez JavaScript.
  • DIRECTORY_SEPARATOR renvoie \ pour l'hébergement de type Windows, au lieu de /.



Pour 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/  
252
T.Todua
echo realpath(dirname(__FILE__));

Si vous placez ceci dans un fichier inclus, le chemin d'accès à cet include est imprimé. Pour obtenir le chemin du script parent, remplacez __FILE__ par $_SERVER['PHP_SELF']. Mais sachez que PHP_SELF est un risque de sécurité!

238
rik
__DIR__

De le manuel :

Le répertoire du fichier. S'il est utilisé dans une inclusion, le répertoire du fichier inclus est renvoyé. Ceci équivaut à dirname(__FILE__). Ce nom de répertoire ne comporte pas de barre oblique, sauf s'il s'agit du répertoire racine.
__FILE__ contient toujours un chemin absolu avec des liens symboliques résolus alors que dans les versions plus anciennes (que 4.0.2), il contenait le chemin relatif dans certaines circonstances.

Remarque : __DIR__ a été ajouté dans PHP 5.3.0.

37

Si vous voulez obtenir le répertoire de travail actuel , utilisez getcwd()

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

__FILE__ retournera le chemin avec le nom du fichier, par exemple sur XAMPP C:\xampp\htdocs\index.php au lieu de C:\xampp\htdocs\

21
pkarecki
dirname(__FILE__) 

donnera le chemin absol du fichier actuel à partir duquel vous demandez le chemin, le chemin de votre répertoire de serveur.

exemples de fichiers:

www/http/html/index.php; si vous placez ce code dans votre index.php, il retournera:

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

www/http/html/class/myclass.php; si vous placez ce code dans votre myclass.php, il retournera:

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

8
Sultanos

Il suffit d'utiliser ci-dessous:

echo __DIR__;
7
Matricore
`realpath(dirname(__FILE__))` 

il vous donne le répertoire du script en cours (le script dans lequel vous avez placé ce code) sans barre oblique. c'est important si vous voulez inclure d'autres fichiers avec le résultat

5
minhajul

Si vous recherchez le chemin absolu par rapport à la racine du serveur, j'ai constaté que cela fonctionnait bien:

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

Voici une fonction utile PHP que j'ai écrite pour cela. Comme la question initiale le précise, elle renvoie le chemin à partir duquel le script initial a été exécuté - et non le fichier dans lequel nous sommes actuellement. .

/**
 * 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;
}
3
blizzrdof77

essayez ceci sur votre script

echo getcwd() . "\n";
2
Shuhad zaman

C'est ce que j'utilise et cela fonctionne dans les environnements Linux. Je ne pense pas que cela fonctionnerait sur une machine 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']);
}
2
andrewniesen
realpath($_SERVER['SCRIPT_FILENAME'])

Pour les scripts exécutés sous le serveur Web, $_SERVER['SCRIPT_FILENAME'] contiendra le chemin d'accès complet au script initialement appelé, donc probablement votre index.php. realpath() n'est pas requis dans ce cas.

Pour le script exécuté depuis la console, $_SERVER['SCRIPT_FILENAME'] contiendra un chemin relatif vers votre script appelé initialement à partir de votre répertoire de travail actuel. Donc, à moins que vous n'ayez changé de répertoire de travail dans votre script, le chemin absolu sera résolu.

1
Victor

Le moyen le plus simple de récupérer le chemin absolu du script initialement exécuté à partir de ce script "principal" et de tout script inclus avec include, require, require_once consiste à le stocker dans une constante début du script principal:

define( 'SCRIPT_ROOT', __FILE__ );

__FILE__ renvoie le chemin du script actuel. Utilisé dans un script inclus renvoie le chemin du fichier inclus, pas le script exécuté initialement lorsque l'OP demande:

Précision: Le script initial exécuté, pas le fichier dans lequel nous sommes actuellement

La solution consistant à stocker le __FILE__ dans une constante est plus facile et plus rapide que de récupérer le chemin à l'aide de debug_backtrace()


La solution ci-dessus convient lorsqu'il existe un seul script "principal" qui includes tous les autres scripts nécessaires, comme dans la plupart des applications Web.

Si ce n'est pas le cas et qu'il peut y avoir plusieurs "scripts initiaux", pour éviter les redéfinitions et pour que le chemin correct soit stocké dans la constante, chaque script peut commencer par:

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