En PHP, quel serait le moyen le plus propre d’obtenir le répertoire parent du script en cours d’exécution par rapport à la racine www? Supposons que j'ai:
$_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php'
Ou juste:
$something_else == '/relative/path/to/script/'
Et je dois obtenir /relative/path/to/
avec des barres obliques correctement insérées. Que suggérerais-tu? Un seul revêtement est préférable.
MODIFIER
Je dois obtenir un chemin relatif à la racine www, dirname(__FILE__)
me donne un chemin absolu dans le système de fichiers afin que cela ne fonctionne pas. $_SERVER['SCRIPT_NAME']
d'autre part "commence" à la racine www.
Si votre script est situé dans /var/www/dir/index.php
, les informations suivantes sont renvoyées:
dirname(__FILE__); // /var/www/dir
ou
dirname( dirname(__FILE__) ); // /var/www
C'est une technique utilisée dans de nombreux frameworks pour déterminer les chemins relatifs à partir de l'app_root.
Structure du fichier:
/var/ www / index.php sous-répertoire / library.php
index.php est mon fichier dispatcher/boostrap vers lequel toutes les demandes sont acheminées:
define(ROOT_PATH, dirname(__FILE__) ); // /var/www
library.php est un fichier situé dans un répertoire supplémentaire et je dois déterminer le chemin relatif à la racine de l'application (/ var/www /).
$path_current = dirname( __FILE__ ); // /var/www/subdir
$path_relative = str_replace(ROOT_PATH, '', $path_current); // /subdir
Il existe probablement un meilleur moyen de calculer le chemin relatif que str_replace()
, mais vous avez l’idée.
À partir de PHP 5.3.0, vous pouvez utiliser __DIR__
à cette fin.
Le répertoire du fichier. Si utilisé dans une inclusion, le répertoire de le fichier inclus est retourné. Ceci est équivalent à dirname (__ FILE__).
Voir PHP Constantes magiques .
C:\www>php --version
PHP 5.5.6 (cli) (built: Nov 12 2013 11:33:44)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
C:\www>php -r "echo __DIR__;"
C:\www
Si j'ai bien compris votre question, supposons que votre script courant soit
/relative/path/to/script/index.php
Cela vous donnerait le répertoire parent de votre script en cours d'exécution relatif au document www:
$parent_dir = dirname(dirname($_SERVER['SCRIPT_NAME'])) . '/';
//$parent_dir will be '/relative/path/to/'
Si vous souhaitez que le répertoire parent de votre script en cours d'exécution soit relatif à la racine du serveur:
$parent_dir = dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . '/';
//$parent_dir will be '/root/some/path/relative/path/to/'
Pour obtenir le parentdir du script en cours.
$parent_dir = dirname(__DIR__);
Fugly, mais ça va le faire:
substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])))
$dir = dirname($file) . DIRECTORY_SEPARATOR;
J'espère que cela t'aidera.
echo getcwd().'<br>'; // getcwd() will return current working directory
echo dirname(getcwd(),1).'<br>';
echo dirname(getcwd(),2).'<br>';
echo dirname(getcwd(),3).'<br>';
Sortie:
C:\wamp64\www\public_html\step
C:\wamp64\www\public_html
C:\wamp64\www
C:\wamp64
Essaye ça. Fonctionne sur les deux serveurs Windows ou Linux ..
str_replace ('\\', '/', nom de répertoire (nom de répertoire (__ FILE__)))
Voici ce que j'utilise depuis que je ne cours pas> 5.2
function getCurrentOrParentDirectory($type='current')
{
if ($type == 'current') {
$path = dirname(__FILE__);
} else {
$path = dirname(dirname(__FILE__));
}
$position = strrpos($path, '/') + 1;
return substr($path, $position);
}
Double nom de répertoire avec le fichier suggéré par @mike b pour le répertoire parent. Le répertoire actuel est trouvé en utilisant simplement cette syntaxe une fois.
Notez que cette fonction ne renvoie que le NOM, des barres obliques doivent ensuite être ajoutées.
J'espère que cela aidera
function get_directory(){
$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
$protocol = substr(strtolower($_SERVER["SERVER_PROTOCOL"]), 0, strpos(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")) . $s;
$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
return $protocol . "://" . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']);
}
define("ROOT_PATH", get_directory()."/" );
echo ROOT_PATH;
C'est aussi une solution possible
$relative = '/relative/path/to/script/';
$absolute = __DIR__. '/../' .$relative;
Ceci est une fonction que j'utilise. Créé une fois, j'ai toujours cette fonctionnalité:
function getDir(){
$directory = dirname(__FILE__);
$directory = explode("/",$directory);
$findTarget = 0;
$targetPath = "";
foreach($directory as $dir){
if($findTarget == 1){
$targetPath = "".$targetPath."/".$dir."";
}
if($dir == "public_html"){
$findTarget = 1;
}
}
return "http://www.".$_SERVER['SERVER_NAME']."".$targetPath."";
}