Получить родительский каталог запущенного скрипта



в 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.

767   13  

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

чтобы получить 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);
}

двойное имя 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

    Ничего не найдено.