Получить родительский каталог запущенного скрипта
в PHP, что было бы самым чистым способом получить родитель каталог текущего запущенного скрипта относительно корня www? Предположим, у меня есть:
$_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php'
или так:
$something_else == '/relative/path/to/script/'
и мне нужно сделать /relative/path/to/ С правильно вставленными косыми чертами. Что бы вы предложили? Предпочтителен один вкладыш.
EDIT
мне нужно получить путь относительно корня сайта www, dirname(__FILE__) дает мне абсолютный путь в файловой системе так это не сработает. $_SERVER['SCRIPT_NAME'] С другой стороны в корень сайта www.
13 ответов:
если ваш скрипт находится в
/var/www/dir/index.phpзатем вернется следующее:dirname(__FILE__); // /var/www/dirили
dirname( dirname(__FILE__) ); // /var/www
Edit
это метод, используемый во многих фреймворках для определения относительных путей из app_root.
структура файла:
/var/ www/ index.php subdir/ library.php.php - это мой файл диспетчера / boostrap, в который направляются все запросы:define(ROOT_PATH, dirname(__FILE__) ); // /var/wwwбиблиотека.php-это какой-то файл, расположенный в дополнительном каталоге, и мне нужно определите путь относительно корня приложения (/var/www/).
$path_current = dirname( __FILE__ ); // /var/www/subdir $path_relative = str_replace(ROOT_PATH, '', $path_current); // /subdirвероятно, есть лучший способ вычислить относительный путь, чем
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/'Если вы хотите родительский каталог вашего запущенного скрипта относительно корня сервера:
$parent_dir = dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . '/'; //$parent_dir will be '/root/some/path/relative/path/to/'
Fugly, но это будет делать это:
substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])))
вот что я использую, так как я не работаю > 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 для родительского каталога, и текущий каталог найден только с помощью этого синтаксиса один раз.
Примечание эта функция возвращает только имя, косые черты должны быть добавлены позже.
попробуйте это. работает как на windows, так и на linux сервере..
str_replace('\\','/',dirname (dirname (__FILE__)))
Я надеюсь, что это поможет вам.
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
Это тоже возможное решение
$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.""; }
Я надеюсь, что это поможет
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;
получил его сам, это немного kludgy, но он работает:
substr(dirname($_SERVER['SCRIPT_NAME']), 0, strrpos(dirname($_SERVER['SCRIPT_NAME']), '/') + 1)Так что если у меня есть
/path/to/folder/index.php, в результате/path/to/.
Comments