Get parent directory of running script

PhpDirectory

Php Problem Overview


In PHP, what would be the cleanest way to get the parent directory of the current running script relative to the www root? Assume I have:

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

Or just:

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

And I need to get /relative/path/to/ with slashes properly inserted. What would you suggest? A one liner is preferred.

EDIT

I need to get a path relative to the www root, dirname(__FILE__) gives me an absolute path in the filesystem so that won't work. $_SERVER['SCRIPT_NAME'] on the other hand 'starts' at the www root.

Php Solutions


Solution 1 - Php

If your script is located in /var/www/dir/index.php then the following would return:

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

or

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

Edit

This is a technique used in many frameworks to determine relative paths from the app_root.

File structure:

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

index.php is my dispatcher/boostrap file that all requests are routed to:

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

library.php is some file located an extra directory down and I need to determine the path relative to the app root (/var/www/).

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

There's probably a better way to calculate the relative path then str_replace() but you get the idea.

Solution 2 - Php

As of PHP 5.3.0 you can use __DIR__ for this purpose.

> The directory of the file. If used inside an include, the directory of > the included file is returned. This is equivalent to > dirname(__ FILE__).

See 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

Solution 3 - Php

To get the parentdir of the current script.

$parent_dir = dirname(__DIR__);

Solution 4 - Php

If I properly understood your question, supposing your running script is

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

This would give you the parent directory of your running script relative to the document www:

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

If you want the parent directory of your running script relative to server root:

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

Solution 5 - Php

Fugly, but this will do it:

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

Solution 6 - Php

I Hope this will help you.

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

Output :

C:\wamp64\www\public_html\step
C:\wamp64\www\public_html
C:\wamp64\www
C:\wamp64

Solution 7 - Php

$dir = dirname($file) . DIRECTORY_SEPARATOR;

Solution 8 - Php

Here is what I use since I am not running > 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);
}

Double dirname with file as suggested by @mike b for the parent directory, and current directory is found by just using that syntax once.

Note this function only returns the NAME, slashes have to be added afterwards.

Solution 9 - Php

This is a function that I use. Created it once so I always have this functionality:

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

Solution 10 - Php

Try this. Works on both windows or linux server..

str_replace('\','/',dirname(dirname(__FILE__)))

Solution 11 - Php

This is also a possible solution

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

Solution 12 - Php

I hope this will help

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;

Solution 13 - Php

Got it myself, it's a bit kludgy but it works:

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

So if I have /path/to/folder/index.php, this results in /path/to/.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTatu UlmanenView Question on Stackoverflow
Solution 1 - PhpMike BView Answer on Stackoverflow
Solution 2 - PhpCharlie VieillardView Answer on Stackoverflow
Solution 3 - PhphansView Answer on Stackoverflow
Solution 4 - PhpMarco DemaioView Answer on Stackoverflow
Solution 5 - PhpBradView Answer on Stackoverflow
Solution 6 - PhpVignesh KMView Answer on Stackoverflow
Solution 7 - PhpJordan Ryan MooreView Answer on Stackoverflow
Solution 8 - PhpAlexView Answer on Stackoverflow
Solution 9 - PhpJohnView Answer on Stackoverflow
Solution 10 - PhpcestarView Answer on Stackoverflow
Solution 11 - PhpcollidoscopeView Answer on Stackoverflow
Solution 12 - PhpGoodhope Kudakwashe DhliwayoView Answer on Stackoverflow
Solution 13 - PhpTatu UlmanenView Answer on Stackoverflow