Как решить ошибку «Неустранимая ошибка: require (): Не удалось открыть требуемый файл '../vendor/autoload.php' (include_path = 'C:\xampp\php\PEAR')?»

Поэтому я использую 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?

Chris Ngure 11.12.2020 11:56

Да, я создал файл .env в корневой папке, который содержит всю информацию о базе данных, такую ​​как имя пользователя, пароль, хост и т. д.

MajesticOverlord 11.12.2020 12:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
2 376
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'. От этого есть несколько преимуществ:

  • Вы не рискуете утечкой важных файлов/данных
  • У вас всегда один и тот же путь включения, и вам не нужно беспокоиться, откуда вызывать этот файл.

Недостатки:

  • Вы должны настроить свой сервер для обслуживания общей папки вместо корневого каталога.

Да, именно так сейчас выглядит моя структура папок. Есть ли способ создать блок доступа к файлу .env на случай, если кто-то введет www.website.com/.env без изменения структуры папок? Кроме того, учитывая структуру вашей папки, как кто-то может заблокировать доступ к файлу .env в браузере? Спасибо за вашу помощь в этом. :D Также, как упоминал @hubare, я смог исправить это с помощью метода $_SERVER['DOCUMENT_ROOT'].

MajesticOverlord 11.12.2020 13:04

> Есть ли способ создать блокировку доступа к файлу .env на случай, если кто-то введет www.website.com/.env? Да. Вы можете определить в своем .htaccess, какие файлы не должны обслуживаться. (Предполагая, что вы используете Apache.) > Кроме того, учитывая вашу структуру папок, как кто-то может заблокировать доступ к файлу .env в браузере? Вы должны установить веб-корень сервера на /public. Таким образом, не может быть никаких файлов за пределами /public. (Если вы посмотрите на любой современный фреймворк, у них у всех есть папка /public)

Sindhara 11.12.2020 13:26

>(Предполагая, что вы используете Apache.) На самом деле я не использую Apache. Я запускаю его на сервере PHP, используя «php -S localhost»: XXXX.> > Вы должны установить веб-корневой каталог сервера в /public. Таким образом, не может быть никаких файлов за пределами /public. О да, это имеет смысл. Большое спасибо. Я заметил, что многие современные фреймворки используют public в качестве корневого каталога. Большое спасибо за вашу помощь.

MajesticOverlord 14.12.2020 22:52
Ответ принят как подходящий

Похоже, вы используете относительный путь, но ожидаете, что он будет работать как абсолютный путь.

обозначение ../ означало родительский каталог, поэтому, если вы перемещаете файл, родительский каталог также изменяется.

Вместо того, чтобы работать относительно, я предпочитаю установить базу и работать вверх.

Используйте $_SERVER['DOCUMENT_ROOT'], который является путем к корню вашего приложения.

require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');

Затем используйте те же обозначения в статическом вызове createImmutable. Я не знаю, куда вы должны это указывать. Если это корень, используйте...

$dotenv=Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);

Другие вопросы по теме