Ruft das übergeordnete Verzeichnis des ausgeführten Skripts ab

72

Was wäre in PHP der sauberste Weg, um das übergeordnete Verzeichnis des aktuell ausgeführten Skripts relativ zum WWW-Stammverzeichnis abzurufen? Angenommen, ich habe:

$_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php'

Oder nur:

$something_else == '/relative/path/to/script/'

Und ich muss /relative/path/to/mit Schrägstrichen richtig einfügen. Was würdest du vorschlagen? Ein Einzeiler ist bevorzugt.

BEARBEITEN

Ich muss einen Pfad relativ zum WWW-Stamm erhalten, dirname(__FILE__)gibt mir einen absoluten Pfad im Dateisystem, damit das nicht funktioniert. $_SERVER['SCRIPT_NAME']Auf der anderen Seite "beginnt" an der WWW-Wurzel.

Tatu Ulmanen
quelle

Antworten:

149

Wenn sich Ihr Skript in befindet, wird /var/www/dir/index.phpFolgendes zurückgegeben:

dirname(__FILE__); // /var/www/dir

oder

dirname( dirname(__FILE__) ); // /var/www

Bearbeiten

Dies ist eine Technik, die in vielen Frameworks verwendet wird, um relative Pfade aus app_root zu bestimmen.

Dateistruktur:

 / var /
      www /
          index.php
          Unterverzeichnis /
                 library.php

index.php ist meine Dispatcher / Boostrap-Datei, an die alle Anforderungen weitergeleitet werden:

define(ROOT_PATH, dirname(__FILE__) ); // /var/www

library.php ist eine Datei, die sich in einem zusätzlichen Verzeichnis befindet, und ich muss den Pfad relativ zum App-Stammverzeichnis (/ var / www /) bestimmen.

$path_current = dirname( __FILE__ ); // /var/www/subdir
$path_relative = str_replace(ROOT_PATH, '', $path_current); // /subdir

Es gibt wahrscheinlich einen besseren Weg, um den relativen Pfad zu berechnen, str_replace()aber Sie bekommen die Idee.

Mike B.
quelle
Das wird nicht funktionieren, da ich den Pfad relativ zur WWW-Wurzel brauche. Ich könnte nur den Teil / var / www ersetzen, aber dies muss unter Windows und * nix funktionieren.
Tatu Ulmanen
Es gibt keine zuverlässige Methode, um ROOT_PATH auf allen Betriebssystemen auf allen Servern zu ermitteln. Die Best-Practice-Technik besteht darin, zu define(ROOT_PATH, dirname(__FILE__));früh in Ihrem Stack zu arbeiten (hoffentlich verwenden Sie einen gemeinsamen Dispatcher oder Bootstrap, damit dies keine Kopfschmerzen verursacht) und diesen in Verbindung mit anderen Funktionen zu verwenden, um einen relativen Pfad zu erstellen.
Mike B
In meinem Fall ist es umgekehrt. Alle Anforderungen werden an /something/cms/index.php weitergeleitet. Wenn Sie also ROOT_PATH von dort aus festlegen, wird / etwas / cms / angezeigt, und ich muss auf das übergeordnete Verzeichnis / Something / zugreifen. Also muss ich wohl nur auf hässliche Saitenmanipulationen zurückgreifen.
Tatu Ulmanen
Ich habe verwendet $_SERVER['SCRIPT_NAME'], um das Verzeichnis zu erhalten, aber ich mag diese Idee. Hervorragende Antwort.
Amal Murali
1
Ab PHP 7.0.0 dirname(__FILE__, 2)kann anstelle von verwendet werden dirname(dirname(__FILE__)). dirnameChangelog
Leon Williams
13

Ab PHP 5.3.0 können Sie __DIR__für diesen Zweck verwenden.

Das Verzeichnis der Datei. Bei Verwendung in einem Include wird das Verzeichnis der enthaltenen Datei zurückgegeben. Dies entspricht dem Namen (__ FILE__).

Siehe PHP Magic-Konstanten .

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
Charlie Vieillard
quelle
8

Wenn ich Ihre Frage richtig verstanden habe, wird angenommen, dass Ihr laufendes Skript lautet

/relative/path/to/script/index.php

Dies würde Ihnen das übergeordnete Verzeichnis Ihres laufenden Skripts relativ zum Dokument www geben:

$parent_dir = dirname(dirname($_SERVER['SCRIPT_NAME'])) . '/';
//$parent_dir will be '/relative/path/to/'

Wenn Sie das übergeordnete Verzeichnis Ihres laufenden Skripts relativ zum Serverstamm haben möchten:

$parent_dir = dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . '/';
//$parent_dir will be '/root/some/path/relative/path/to/'
Marco Demaio
quelle
Hallo! Ich habe versucht, dies vorher zu fragen ... Ist es üblich, einen abschließenden Schrägstrich zu setzen oder ihn wegzulassen? Ich lasse es gerne weg, weil: $url = BASE_URL . '/my/path/';für mich besser aussieht als $url = BASE_URL . 'my/path/';. Gibt es einen Standardweg oder was ist am häufigsten?
Nkkollaw
@nbrogi: Ich möchte es immer hinzufügen, damit Sie sofort sehen können, dass es sich um ein Verzeichnis / einen Ordner und nicht um einen Dateinamen ohne die Erweiterung handelt.
Marco Demaio
8

So rufen Sie das übergeordnete Verzeichnis des aktuellen Skripts ab

$parent_dir = dirname(__DIR__);
Hans
quelle
5

Fugly, aber das wird es tun:

substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])))
Brad
quelle
4

Ich hoffe, dies wird dir helfen.

echo getcwd().'<br>'; // getcwd() will return current working directory
echo dirname(getcwd(),1).'<br>';
echo dirname(getcwd(),2).'<br>';
echo dirname(getcwd(),3).'<br>';

Ausgabe :

C:\wamp64\www\public_html\step
C:\wamp64\www\public_html
C:\wamp64\www
C:\wamp64
Vignesh KM
quelle
2
$dir = dirname($file) . DIRECTORY_SEPARATOR;
Jordan Ryan Moore
quelle
1
Aber ist das nicht DIRECTORY_SEPARATOR defineunnötig? PHP scheint mit beiden Arten von Schrägstrichen `/ \` auch auf Windows-Computern gut zu funktionieren.
Marco Demaio
2

Folgendes verwende ich, da ich nicht> 5.2 verwende

function getCurrentOrParentDirectory($type='current')
{
    if ($type == 'current') {
        $path = dirname(__FILE__);  
    } else {
        $path = dirname(dirname(__FILE__));
    }
    $position = strrpos($path, '/') + 1;
    return substr($path, $position);
}

Doppelter Verzeichnisname mit Datei, wie von @mike b für das übergeordnete Verzeichnis vorgeschlagen, und das aktuelle Verzeichnis wird gefunden, indem diese Syntax nur einmal verwendet wird.

Beachten Sie, dass diese Funktion nur den NAMEN zurückgibt. Danach müssen Schrägstriche hinzugefügt werden.

Alex
quelle
1

Versuche dies. Funktioniert sowohl auf Windows- als auch auf Linux-Servern.

str_replace ('\\', '/', dirname (dirname (__ FILE__)))

Zestar
quelle
1

Dies ist eine Funktion, die ich benutze. Hat es einmal erstellt, damit ich immer diese Funktionalität habe:

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."";
}
John
quelle
Wenn ich das gut verstehe, sucht dieses Skript den absoluten Pfad zu "public_html". Sollte in diesem Fall das Symbol '==' nicht durch '! =' Ersetzt werden?
Gcousin
0

Dies ist auch eine mögliche Lösung

$relative = '/relative/path/to/script/';
$absolute = __DIR__. '/../' .$relative;
Kollidoskop
quelle
0

Ich hoffe das wird helfen

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;
Goodhope Kudakwashe Dhliwayo
quelle
-7

Habe es selbst, es ist ein bisschen klobig, aber es funktioniert:

substr(dirname($_SERVER['SCRIPT_NAME']), 0, strrpos(dirname($_SERVER['SCRIPT_NAME']), '/') + 1)

Wenn ja /path/to/folder/index.php, führt dies zu /path/to/.

Tatu Ulmanen
quelle
2
Ich verstehe nicht, dass Sie nur zweimal anrufen dirnamemüssen, um zum übergeordneten Verzeichnis zu gelangen, siehe meine Antwort.
Marco Demaio