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.

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.


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

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/'

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__);

5

Fugly, aber das wird es tun:

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

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

2
$dir = dirname($file) . DIRECTORY_SEPARATOR;

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.


1

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

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


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

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;

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;

-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/.


2
Ich verstehe nicht, dass Sie nur zweimal anrufen dirnamemüssen, um zum übergeordneten Verzeichnis zu gelangen, siehe meine Antwort.
Marco Demaio
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.