web-dev-qa-db-fra.com

Obtenir le répertoire parent du script en cours d'exécution

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.

61
Tatu Ulmanen

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

Modifier

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.

121
Mike B

À 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
13
Charlie Vieillard

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/'
8
Marco Demaio

Pour obtenir le parentdir du script en cours.

$parent_dir = dirname(__DIR__);
6
hans

Fugly, mais ça va le faire:

substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])))
5
Brad
$dir = dirname($file) . DIRECTORY_SEPARATOR;
2
Jordan Ryan Moore

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
2
Vignesh KM

Essaye ça. Fonctionne sur les deux serveurs Windows ou Linux ..

str_replace ('\\', '/', nom de répertoire (nom de répertoire (__ FILE__)))

1
cestar

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.

1
Alex

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;
0
collidoscope

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."";
}
0
John