获取运行脚本的父目录

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

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

要不就:

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

我需要得到/relative/path/to/正确插入斜线。 你会build议什么? 一个class轮是首选。

编辑

我需要得到一个相对于www根的path, dirname(__FILE__)在文件系统中给了我一个绝对path,所以不起作用。 另一方面, $_SERVER['SCRIPT_NAME']在www根开始。

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

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

要么

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

编辑

这是一个在许多框架中用来确定app_root的相对path的技术。

文件结构:

 在/ var /
      万维网/
          的index.php
          子目录/
                  library.php

index.php是我的dispatcher / boostrap文件,所有请求都被路由到:

 define(ROOT_PATH, dirname(__FILE__) ); // /var/www 

library.php是一些文件位于一个额外的目录,我需要确定相对于应用程序根(/ var / www /)的path。

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

可能有更好的方法来计算相对path,然后str_replace()但你明白了。

从PHP 5.3.0开始,可以使用__DIR__来达到这个目的。

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

看PHP魔术常量 。

 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 

如果我正确理解你的问题,假设你的脚本是

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

这将给你的运行脚本相对于文档www的父目录:

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

如果您想要运行脚本的父目录相对于服务器root:

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

获取当前脚本的parentdir。

 $parent_dir = dirname(__DIR__); 

Fugly,但这会做到这一点:

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

这是我使用,因为我没有运行> 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为父目录build议的文件名为double dirname,使用该语法find当前目录一次。

注意这个函数只返回NAME,之后必须加斜线。

尝试这个。 适用于Windows或Linux服务器

str_replace函数( '\\', '/',目录名(目录名(__ FILE__)))

这也是一个可能的解决scheme

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

这是我使用的一个function。 创build一次,所以我总是有这个function:

 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 

有我自己,这有点kludgy,但它的作品:

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

所以如果我有/path/to/folder/index.php ,这将导致/path/to/