#php #composer-php #phpdotenv
#php #композитор-php #phpdotenv
Вопрос:
Итак, я использую vlucas /phpdotenv в своем php-приложении для хранения и использования переменных среды. Я создал db.php файл, содержащий конфигурацию моего подключения к базе данных. Структура папок root/config/db.php .
У меня есть require('../vendor/autoload.php');
в db.php файл, а затем я использовал
$dotenv=DotenvDotenv::createImmutable('../');
$dotenv->load();
print_r($_ENV);
для доступа к переменным среды, поскольку файл .env находится в корне каталога. Все это прекрасно работает, когда я обращаюсь к db.php файл на сервере, но когда я включаю этот файл в register.php файл, который находится в корне, я получаю сообщение об ошибке «Fatal error: require(): требуется неудачное открытие»../vendor/автозагрузка.php’ (include_path=’C:xamppphpPEAR ‘)».
Однако, когда я меняю каталог autoload.php чтобы сопоставить путь, я затем получаю эту ошибку: «Uncaught Dotenv Exception InvalidPathException: не удается прочитать ни один из файлов среды в [.. /.env]».
Может кто-нибудь, пожалуйста, помочь мне здесь? Спасибо.
Комментарии:
1. Здравствуйте, вы создали файл .env?
2. Да, я создал файл .env в корневой папке, который содержит всю информацию базы данных, такую как имя пользователя, пароль, хост и т.д.
Ответ №1:
Похоже, вы используете относительный путь, но ожидаете, что он будет функционировать как абсолютный путь.
обозначение ../ означало родительский каталог, поэтому при перемещении файла родительский каталог также изменяется.
Вместо того, чтобы работать относительно, я предпочитаю установить базу и работать вверх.
Используйте $_SERVER['DOCUMENT_ROOT']
, который является путем к файлу в корне вашего приложения.
require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');
Затем используйте те же обозначения в createImmutable
статическом вызове. Я не знаю, на что вы должны указывать. Если это корень, используйте…
$dotenv=DotenvDotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);
Ответ №2:
Итак, давайте посмотрим на это. Ваша структура каталогов выглядит примерно так:
/
|- 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'
.
Это дает несколько преимуществ:
- Вы не рискуете утечкой разумных файлов / данных
- У вас всегда один и тот же путь включения, и вам не нужно беспокоиться о том, откуда вызывать этот файл
Недостатки:
- Вы должны настроить свой сервер для обслуживания общей папки вместо корневого каталога.
Комментарии:
1. Да, именно так сейчас выглядит моя структура папок. Есть ли способ, которым я могу создать блок доступа к файлу .env, если кто-то вводит www.website.com/.env без изменения структуры папок ? Также, учитывая вашу структуру папок, как кто-то может быть заблокирован от доступа к файлу .env в браузере? Спасибо за вашу помощь в этом. 😀 Также, как упоминал @hubare, я смог это исправить, используя метод $ _SERVER[‘DOCUMENT_ROOT’] .
2. > Есть ли способ, которым я могу создать блок доступа к файлу .env, если кто-то вводит www.website.com/.env Да. Вы можете определить в своем
.htaccess
, какие файлы не должны обслуживаться. (Предполагается, что вы используете Apache.) > Также, учитывая вашу структуру папок, как кто-то может быть заблокирован от доступа к файлу .env в браузере? Для веб-корня сервера необходимо установить/public
значение . Таким образом, не может быть никаких файлов за пределами/public
access. (Если вы посмотрите на любой современный фреймворк, у всех них есть/public
папка)3. >(Предполагается, что вы используете Apache.) Я на самом деле не использую Apache. Я запускаю его на PHP-сервере, используя ‘php -S localhost’: XXXX.> > Вы бы установили веб-корень сервера в /public . Таким образом, не может быть никаких файлов за пределами / общедоступных. О да, это имеет смысл. Большое спасибо> Я заметил, что многие современные фреймворки используют public в качестве корневого каталога. Большое спасибо за вашу помощь.