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.
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:
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
_
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'];
_
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!:
DIRECTORY_SEPARATOR
renvoie \
pour l'hébergement de type Windows, au lieu de /
.//(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/
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é!
__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.
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\
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/
Il suffit d'utiliser ci-dessous:
echo __DIR__;
`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
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'])
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;
}
essayez ceci sur votre script
echo getcwd() . "\n";
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']);
}
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.
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 include
s 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__ );
}