Поэтому я использую vlucas/phpdotenv в своем php-приложении для хранения и использования переменных среды. Я создал файл db.php, который содержит конфигурацию моего подключения к базе данных. Структура папок: root/config/db.php.
У меня есть require('../vendor/autoload.php');
в файле db.php, а затем я использовал
$dotenv=Dotenv\Dotenv::createImmutable('../');
$dotenv->load();
print_r($_ENV);
для доступа к переменным среды, поскольку файл .env находится в корне каталога. Все работает отлично, когда я получаю доступ к файлу db.php на сервере, но когда я включаю этот файл в файл register.php, который находится в корне, я получаю сообщение об ошибке «Неустранимая ошибка: требуется (): требуется неудавшееся открытие». ./vendor/autoload.php' (include_path='C:\xampp\php\PEAR')".
Однако, когда я меняю каталог autoload.php, чтобы он соответствовал пути, я получаю эту ошибку: «Uncaught Dotenv\Exception\InvalidPathException: невозможно прочитать ни один из файлов среды в [../.env]».
Может кто-нибудь, пожалуйста, помогите мне здесь? Спасибо.
Да, я создал файл .env в корневой папке, который содержит всю информацию о базе данных, такую как имя пользователя, пароль, хост и т. д.
Итак, давайте посмотрим на это. Ваша структура каталогов выглядит примерно так:
/
|- register.php
|- login.php
|- .env
|- /config
|- db.php
Есть несколько проблем с этим. Один из них: файлы, которые не должны быть доступны для веб-браузеров, доступны. (попробуйте вызвать на your-domain.com/.env. Если вы не защитили это файлом .htaccess, вы сделаете доступной информацию о своей базе данных)
Но возвращаясь к вашей проблеме:
../
— относительный путь. По отношению к файлу это была точка входа для звонка.
Давайте посмотрим на это: если вы вызовете config/db.php
, то current working directory
будет config
, а ../
будет указывать на корневой путь.
Если вы вызовете register.php
, то current working directory
будет корневым путем, а ../
укажет на родительский каталог.
Вы должны пойти с чем-то вроде этого:
/
|- /public
|- login.php
|- register.php
|- .env
|- bootstrap.php
|- /conf
|- db.php
Каждый файл в public
должен включать bootstrap.php
, где будет выполняться dotenv. И вместо чего-то вроде './env'
вы можете использовать __DIR__/ . '.env'
.
От этого есть несколько преимуществ:
Недостатки:
Да, именно так сейчас выглядит моя структура папок. Есть ли способ создать блок доступа к файлу .env на случай, если кто-то введет www.website.com/.env без изменения структуры папок? Кроме того, учитывая структуру вашей папки, как кто-то может заблокировать доступ к файлу .env в браузере? Спасибо за вашу помощь в этом. :D Также, как упоминал @hubare, я смог исправить это с помощью метода $_SERVER['DOCUMENT_ROOT'].
> Есть ли способ создать блокировку доступа к файлу .env на случай, если кто-то введет www.website.com/.env? Да. Вы можете определить в своем .htaccess
, какие файлы не должны обслуживаться. (Предполагая, что вы используете Apache.) > Кроме того, учитывая вашу структуру папок, как кто-то может заблокировать доступ к файлу .env в браузере? Вы должны установить веб-корень сервера на /public
. Таким образом, не может быть никаких файлов за пределами /public
. (Если вы посмотрите на любой современный фреймворк, у них у всех есть папка /public
)
>(Предполагая, что вы используете Apache.) На самом деле я не использую Apache. Я запускаю его на сервере PHP, используя «php -S localhost»: XXXX.> > Вы должны установить веб-корневой каталог сервера в /public. Таким образом, не может быть никаких файлов за пределами /public. О да, это имеет смысл. Большое спасибо. Я заметил, что многие современные фреймворки используют public в качестве корневого каталога. Большое спасибо за вашу помощь.
Похоже, вы используете относительный путь, но ожидаете, что он будет работать как абсолютный путь.
обозначение ../ означало родительский каталог, поэтому, если вы перемещаете файл, родительский каталог также изменяется.
Вместо того, чтобы работать относительно, я предпочитаю установить базу и работать вверх.
Используйте $_SERVER['DOCUMENT_ROOT']
, который является путем к корню вашего приложения.
require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');
Затем используйте те же обозначения в статическом вызове createImmutable
. Я не знаю, куда вы должны это указывать. Если это корень, используйте...
$dotenv=Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);
Здравствуйте, вы создали файл .env?