在PHP中,获取当前运行脚本的父目录相对于www root的最简洁方法是什么?假设我有:
$_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php'
或者只是:
$something_else == '/relative/path/to/script/'
我需要正确插入斜杠/relative/path/to/
。你会建议什么?一个衬垫是首选。
修改
我需要获得相对于www root的路径,dirname(__FILE__)
在文件系统中给出了一个绝对路径,这样就无法工作了。另一方面,$_SERVER['SCRIPT_NAME']
在www根处“开始”。
答案 0 :(得分:124)
如果您的脚本位于/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是我的调度程序/ boostrap文件,所有请求都被路由到:
define(ROOT_PATH, dirname(__FILE__) ); // /var/www
library.php是一个位于额外目录下的文件,我需要确定相对于app root的路径(/ var / www /)。
$path_current = dirname( __FILE__ ); // /var/www/subdir
$path_relative = str_replace(ROOT_PATH, '', $path_current); // /subdir
可能有更好的方法来计算相对路径然后str_replace()
,但你明白了。
答案 1 :(得分:13)
从PHP 5.3.0开始,您可以使用__DIR__
来实现此目的。
文件的目录。如果在include中使用,则目录为 包含的文件被返回。这相当于 dirname(__ FILE __)。
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
答案 2 :(得分: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/'
答案 3 :(得分:8)
获取当前脚本的parentdir。
$parent_dir = dirname(__DIR__);
答案 4 :(得分:5)
很难过,但是这样做了:
substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])))
答案 5 :(得分:2)
$dir = dirname($file) . DIRECTORY_SEPARATOR;
答案 6 :(得分:2)
我希望这会对你有所帮助。
image = new Image();
image.BindingContext = this;
image.SetBinding(Image.Source, nameof(ImageFile));
输出:
echo getcwd().'<br>'; // getcwd() will return current working directory
echo dirname(getcwd(),1).'<br>';
echo dirname(getcwd(),2).'<br>';
echo dirname(getcwd(),3).'<br>';
答案 7 :(得分:1)
这是我使用的,因为我没有运行&gt; 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,只使用该语法一次找到当前目录。
请注意,此功能仅返回NAME,之后必须添加斜杠。
答案 8 :(得分:1)
试试这个。 适用于Windows或Linux服务器..
str_replace函数( '\\', '/',目录名(目录名(FILE __ __)))
答案 9 :(得分:0)
这也是一种可能的解决方案
$relative = '/relative/path/to/script/';
$absolute = __DIR__. '/../' .$relative;
答案 10 :(得分:0)
这是我使用的功能。创建它一次,所以我总是有这个功能:
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."";
}
答案 11 :(得分: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;
答案 12 :(得分:-7)
得到它自己,它有点kludgy但它的作用:
substr(dirname($_SERVER['SCRIPT_NAME']), 0, strrpos(dirname($_SERVER['SCRIPT_NAME']), '/') + 1)
因此,如果我有/path/to/folder/index.php
,则会产生/path/to/
。