获取运行脚本的父目录


72

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

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

要不就:

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

而且我需要/relative/path/to/正确插入斜线。你有什么建议?优选一个衬里。

编辑

我需要获取一个相对于www根目录的路径,dirname(__FILE__)为我提供文件系统中的绝对路径,这样就无法正常工作。$_SERVER['SCRIPT_NAME']另一方面,从www根目录开始。

Answers:


149

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

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

要么

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

编辑

这是许多框架中用来确定来自app_root的相对路径的技术。

文件结构:

 / var /
      万维网/
          index.php
          subdir /
                 library.php

index.php是我的调度程序/ boostrap文件,所有请求都路由到:

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()但是您知道了。


这将无法正常工作,因为我需要相对于www根目录的路径。我可以替换掉/ var / www部分,但这需要在Windows和* nix上工作。
塔图·乌尔曼嫩

在所有服务器的所有操作系统上,没有可靠的确定方法来确定ROOT_PATH。最佳实践技术是define(ROOT_PATH, dirname(__FILE__));在堆栈中尽早使用(希望您使用通用的调度程序或引导程序,因此实现起来不会很麻烦),并将其与其他函数结合使用以生成相对路径。
Mike B

就我而言,这是另一回事。所有请求都路由到/something/cms/index.php,因此从那里设置ROOT_PATH会导致/ something / cms /,并且我需要访问父目录/ something /。所以我想我只需要采取一些难看的字符串操作。
塔图·乌尔曼嫩

我一直在$_SERVER['SCRIPT_NAME']获取目录,但是我喜欢这个主意。极好的答案。
阿马尔·穆拉利

1
从PHP 7.0.0开始,dirname(__FILE__, 2)可以代替使用dirname(dirname(__FILE__))dirname变更日志
Leon Williams

13

从PHP 5.3.0开始,您可以__DIR__用于此目的。

文件的目录。如果在include中使用,则返回包含文件的目录。这等效于dirname(__ FILE__)。

参见PHP Magic常量

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

如果我正确理解了您的问题,那么假设您正在运行的脚本是

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

嗨!我以前曾尝试过问过这个问题。我喜欢忽略它,因为:$url = BASE_URL . '/my/path/';在我看来比更好$url = BASE_URL . 'my/path/';。有没有一种标准的方法或最常见的方法?
nkkollaw

@nbrogi:我总是喜欢添加它,因此您可以立即看到它是目录/文件夹,而不是没有扩展名的文件名。
Marco Demaio 2013年

8

获取当前脚本的parentdir。

$parent_dir = dirname(__DIR__);

5

麻烦,但这可以做到:

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

4

我希望这能帮到您。

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

这是我使用的,因为我没有运行> 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所建议的,将父目录的文件名替换为双目录名,并且只需使用该语法一次即可找到当前目录。

请注意,此函数仅返回NAME,之后必须添加斜杠。


1

尝试这个。在Windows或Linux服务器上均可使用。

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


1

这是我使用的功能。创建它一次,所以我始终具有以下功能:

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

如果我很了解,该脚本将寻找“ public_html”的绝对路径。在这种情况下,不应该将'=='符号替换为'!='吗?
gcousin

0

这也是可能的解决方案

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

0

我希望这个能帮上忙

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

我自己搞定了,有点麻烦,但是有效:

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

因此,如果有的话/path/to/folder/index.php,结果为/path/to/


2
我不明白您只需要打两次电话就dirname可以到达父目录,请参阅我的答案。
Marco Demaio 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.