Php 获取正在运行的脚本的父目录

Php 获取正在运行的脚本的父目录,php,directory,Php,Directory,在PHP中,获取当前运行脚本相对于www根目录的父目录的最干净的方法是什么?假设我有: $_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php' 或者只是: $something_else == '/relative/path/to/script/' 我需要正确插入斜杠来获取/relative/path/to/。你有什么建议?最好是一个衬里 编辑 我需要获得一个相对于www根目录的路径,dirname(\uuuuu FIL

在PHP中,获取当前运行脚本相对于www根目录的父目录的最干净的方法是什么?假设我有:

$_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php'
或者只是:

$something_else == '/relative/path/to/script/'
我需要正确插入斜杠来获取
/relative/path/to/
。你有什么建议?最好是一个衬里

编辑


我需要获得一个相对于www根目录的路径,
dirname(\uuuuu FILE\uuuu)
在文件系统中为我提供了一个绝对路径,这样就不起作用了
$\u服务器['SCRIPT\u NAME']
另一方面,从www根目录“启动”。

如果脚本位于
/var/www/dir/index.php
中,则会返回以下内容:

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


编辑 这是一种在许多框架中用于确定app_根的相对路径的技术

文件结构:

/var/ www/ index.php subdir/ library.php library.php是位于一个额外目录下的某个文件,我需要确定相对于app root(/var/www/)的路径


可能有一种比str_replace()更好的方法来计算相对路径,但是你知道了。

我自己知道了,有点麻烦,但它可以工作:

$dir = dirname($file) . DIRECTORY_SEPARATOR;
substr(dirname($_SERVER['SCRIPT_NAME']), 0, strrpos(dirname($_SERVER['SCRIPT_NAME']), '/') + 1)

因此,如果我有
/path/to/folder/index.php
,如果我正确理解了您的问题,假设您运行的脚本是

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

以下是我使用的,因为我没有运行>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);
}
双击dirname和@mike b建议的父目录的文件,只需使用该语法一次即可找到当前目录


注意:此函数仅返回名称,之后必须添加斜杠。Fugly,但这样做:

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

试试这个可在windows或linux服务器上运行。


str\u replace(“\\”、“/”、dirname(dirname(\uu FILE\uuuu))

从PHP5.3.0开始,您可以为此使用
\uu DIR\uuuu

文件的目录。如果在包含中使用,则为 返回包含的文件。这相当于 目录名(文件名)


获取当前脚本的parentdir

$parent_dir = dirname(__DIR__);

这也是一种可能的解决办法

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

这是我使用的一个函数。创建一次,因此我始终具有以下功能:

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

我希望这对你有帮助

echo getcwd().'<br>'; // getcwd() will return current working directory
echo dirname(getcwd(),1).'<br>';
echo dirname(getcwd(),2).'<br>';
echo dirname(getcwd(),3).'<br>';
我希望这会有所帮助

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;

这不起作用,因为我需要相对于www根的路径。我可以直接替换其中的/var/www部分,但这需要在Windows和*nix上工作。没有可靠的可靠方法来确定所有服务器上所有操作系统上的根路径。最佳实践技术是
定义(ROOT_路径,dirname(_文件__))在堆栈的早期(希望您使用一个通用的dispatcher或bootstrap,这样实现起来就不会很麻烦),并将其与其他函数结合使用,以生成一个相对路径。在我的例子中,情况正好相反。所有请求都被路由到/something/cms/index.php,因此从那里设置ROOT_路径将导致/something/cms/,我需要访问父目录/something/。所以我想我只能求助于一些丑陋的字符串操作。我一直在使用
$\u SERVER['SCRIPT\u NAME']
获取目录,但我喜欢这个想法。回答得很好。从PHP7.0.0开始,可以使用
dirname(\uuuuu文件,2)
代替
dirname(dirname(\uu文件))
。我不明白,你只需要调用两次
dirname
就可以到达父目录,请参见我的答案。但是
目录分隔符定义
不是一件不必要的事情吗?PHP似乎在Windows机器上也能很好地处理两种类型的斜杠“/\”。嗨!我以前试过问这个问题。。。放一个尾随斜杠或省略它是常见的做法吗?我想省略它,因为:
$url=BASE\u url。”/我的/path/'
$url=BASE\u url'更好看我的/path/'。有没有标准的方法或最常见的方法?@nbrogi:我喜欢总是添加它,这样你可以立即看到它是一个目录/文件夹,而不是没有扩展名的文件名。如果我理解得很好,这个脚本会寻找“public\u html”的绝对路径。在这种情况下,不应该用“!=”替换“==”符号吗?
$relative = '/relative/path/to/script/';
$absolute = __DIR__. '/../' .$relative;
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."";
}
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
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;