Как мне устранить ошибку «Фатальная ошибка: требуется (): требуется неудачное открытие»../vendor/автозагрузка.php’ (include_path=’C:xamppphpPEAR ‘) ?»

#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 в качестве корневого каталога. Большое спасибо за вашу помощь.