Отримайте 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.