web-dev-qa-db-ja.com

実行中のスクリプトの親ディレクトリを取得する

PHPでは、wwwルートに関連する現在実行中のスクリプトのディレクトリを取得する最もクリーンな方法は何ですか?私が持っていると仮定します:

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

あるいは単に:

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

そして、スラッシュが正しく挿入された_/relative/path/to/_を取得する必要があります。何を提案しますか? 1つのライナーが好ましい。

[〜#〜] edit [〜#〜]

Wwwルートへの相対パスを取得する必要があります。dirname(__FILE__)はファイルシステム内の絶対パスを提供するため、機能しません。 _$_SERVER['SCRIPT_NAME']_一方、wwwルートで「開始」します。

63
Tatu Ulmanen

スクリプトが_/var/www/dir/index.php_にある場合、次が返されます。

_dirname(__FILE__); // /var/www/dir
_

または

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

編集

これは、多くのフレームワークでapp_rootからの相対パスを決定するために使用される手法です。

ファイル構造:

 /var/
 www /
 index.php 
 subdir /
 library.php 

index.phpは、すべてのリクエストがルーティングされるディスパッチャ/ブーストファイルです。

_define(ROOT_PATH, dirname(__FILE__) ); // /var/www
_

library.phpは追加のディレクトリの下にあるファイルであり、アプリのルート(/ var/www /)からの相対パスを決定する必要があります。

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

おそらくstr_replace()よりも相対パスを計算する方が良い方法はありますが、アイデアは得られます。

126
Mike B

PHP 5.3.0では、__DIR__ この目的のために。

ファイルのディレクトリ。インクルード内で使用される場合、インクルードされたファイルのディレクトリが返されます。これはdirname(__ FILE__)と同等です。

PHP Magic constants を参照してください。

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

現在のスクリプトのparentdirを取得します。

$parent_dir = dirname(__DIR__);
8
hans

あなたの質問を適切に理解していれば、実行中のスクリプトは

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

これにより、ドキュメントwwwに関連する実行中のスクリプトの親ディレクトリが得られます。

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

サーバールートに関連する実行中のスクリプトの親ディレクトリが必要な場合:

$parent_dir = dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . '/';
//$parent_dir will be '/root/some/path/relative/path/to/'
8
Marco Demaio

Fuいが、これはそれを行います:

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

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

親ディレクトリの@mike bで示唆されているように、ファイルのあるdirnameをダブルクリックし、その構文を1回使用するだけで現在のディレクトリを見つけます。

この関数はNAMEのみを返すことに注意してください。その後にスラッシュを追加する必要があります。

2
Alex

これがお役に立てば幸いです。

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

出力:

C:\wamp64\www\public_html\step
C:\wamp64\www\public_html
C:\wamp64\www
C:\wamp64
2
Vignesh KM

これを試して。 両方のWindowsまたはLinuxサーバーで動作します。

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

1
cestar

これが役立つことを願っています

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;

これも可能な解決策です

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

これは私が使用する機能です。一度作成したので、私は常にこの機能を持っています:

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