Отримайте Root Directory Path проекту PHP


115

Я маю цю структуру папок у своєму проекті PHP. (це як показано в затемненнях)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

Коли я спробую цей код

echo $_SERVER['DOCUMENT_ROOT']

вихід є

D: / робоча область

Як я можу отримати шлях до RootDirectory системи ( MySystem), без жорсткого кодування імені папки?

Відповіді:


146

Для PHP> = 5.3.0 спробуйте

Магічні константи PHP .

__DIR__

І зробіть свій шлях відносним.

Для PHP <5.3.0 спробуйте

dirname(__FILE__)

3
це просто приголомшливо, я спробував $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] тощо, але це спрацювало чудово!
webblover

78
Це залежить від місця використання __DIR__ . Це відносно самого файлу, тому, якщо у включеному, всередині підкаталогу, він не поверне лише ваш кореневий каталог.
Іріс

10
Він не дасть кореневого каталогу
inrsaurabh

1
швидка примітка для тих, хто натрапляє на цю відповідь, шукаючи відповідь на задане питання, DIR отримує каталог поточного файлу, а не корінь проекту, якщо ви не називаєте його у файлі, що знаходиться в корені проекту, але як php не мають концепцію проекту, усі шляхи повинні бути абсолютними або відносними до поточного місця розташування
MikeT

Будь ласка, не заявляйте відповідь, яка не відповідає правильним питанням, лише тому, що вона вам допомогла.
ElYeante

73

Коли ти це кажеш

$_SERVER['DOCUMENT_ROOT']

містить цей шлях:

D:/workspace

Тоді D:це те, що ви шукаєте, чи не так? У такому випадку ви можете підірвати рядок косою рискою і повернути перший:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

Це виведе кореневий каталог сервера.

Оновлення: коли ви використовуєте константу DIRECTORY_SEPARATORзамість косої косий штрих ('/' ), цей код також працює в Windows.

Оновлення 2:$_SERVER глобальна змінна не завжди доступна. Наприклад, у командному рядку (cli). Тому слід використовувати __DIR__замість цього $_SERVER['DOCUMENT_ROOT']. __DIR__повертає шлях до самого файлу php.


2
І ви можете використовувати __DIR__замість цього $_SERVER['DOCUMENT_ROOT'].
Армін

Вибачте, якщо я не пояснив своє запитання належним чином, те, що мені насправді потрібно, - це "D: / робоча область / MySystem"
Nalaka526,

1
якщо шлях вашого кореневого каталогу у формі / var / public / www ", використовуючи цей метод, перша рядок у масиві буде порожньою (0) / (1) / (2) / (3). Корінь буде друга рядок $ pathInPieces [1]
tbradley22

36

використовувати функцію PHP:

getcwd()

Отримує поточний робочий каталог.


1
Це повертає поточний шлях до файлу. Не кореневий шлях
Yousha Aleayoub

9

Я хочу вказати на те, як Wordpress справляється з цим:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

Оскільки Wordpress дуже важко використовується в Інтернеті, а також добре працює на місцях, я дуже довіряю цьому методу.


1
Я думаю, це працює лише тоді, коли у вас є два рівні каталогів. Правильно? Я маю на увазі, коли викликає його з base_project_directory / folder1 / folder2 / folder3 / file.php, він не повертає base_project_directory.
Алі Халілі

"Оскільки Wordpress дуже важко використовується в Інтернеті, а також працює чудово на місцях, я дуже довіряю цьому методу". Я не вважаю, що це особливо гарний аргумент, враховуючи якість коду WP та послуговуваність.
Алекс Баркер

1
@AlexBarker Я заперечую за те, що ви розумієте, що WP має поганий досвід безпеки. Насправді це дуже безпечно і має репресивну команду, зосереджену на безпеці - в останні роки в ядрі було дуже мало експлуатованих проблем безпеки (в тому числі, коли ви коментували).
Вільям Паттон

3

Ви можете спробувати: $_SERVER['PATH_TRANSLATED']

цитата:

Шлях на основі файлової системи (не документ root) до поточного сценарію після того, як сервер здійснив віртуальне реальне відображення. Примітка: Згідно з PHP 4.3.2, PATH_TRANSLATEDбільше не встановлюється неявно під SAPI Apache 2, на відміну від ситуації в Apache 1, де вона встановлена ​​на те саме значення, що і SCRIPT_FILENAMEзмінна сервер, коли вона не заповнена Apache.
Ця зміна була внесена у відповідність зі специфікацією CGI, згідно з якою PATH_TRANSLATED має існувати лише тоді, коли PATH_INFOвизначено. Користувачі Apache 2 можуть використовувати AcceptPathInfo = Onвсередині httpd.confдля визначенняPATH_INFO

джерело: php.net/manual



0

Підсумок

Цей приклад передбачає, що ви завжди знаєте, де знаходиться коренева папка apache '/ var / www /', і ви намагаєтеся знайти наступний шлях до папки (наприклад, '/ var / www / my_website_folder'). Також це працює зі скрипту або веб-браузера, тому є додатковий код.

Код PHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

Приклад

echo getHtmlRootFolder();

Вихід:

/var/www/somedir/

Деталі:

По суті, спочатку намагається отримати DOCUMENT_ROOT, якщо він містить '/ var / www /', а потім використовувати його, а потім отримати поточний dir (який багато існує у проекті) і отримує значення наступного шляху на основі підрахунку $ root шляху. Примітка: додано rtrim-оператори, щоб забезпечити повернення шляху, що закінчується на '/' у всіх випадках. Він не перевіряє, чи вимагає він бути більшим, ніж / var / www /, а також може повернути / var / www / як можливу відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.