Php.env с Docker

Чтобы добавить phpdotenv, мне нужно запустить следующую команду терминала:

composer require vlucas/phpdotenv

Но я не совсем уверен, в какой папке мне следует запускать команду.

Моя структура папок выглядит так:

SITE
--> www
   --> css
   --> include
       - database.php
   - index.php
docker-compose.yml
dockerfile

Когда я запускаю команду композитора из основной папки SITE, она создает папку с именем Vendor, а файл композитора.json выглядит следующим образом:

{
"require": {
    "vlucas/phpdotenv": "^5.6"
  }
}

Итак, теперь структура выглядит так:

SITE
--> www
   --> css
   --> include
       - database.php
   - index.php
--> vendor
- composer.json
- composer.lock
- docker-compose.yml
- dockerfile

Итак, теперь я могу создать файл .env в своей папке www вместе с другими веб-файлами, который выглядит следующим образом:

DATABASE_HOST=db
DATABASE_NAME=myDb
DATABASE_USER=user
DATABASE_PASS=test

Итак, в моем файле data.php я пытаюсь передать информацию из моего файла .env:

<?php
  require __DIR__ . "/vendor/autoload.php";

  $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
  $dotenv->load();   
 
  $dbhost = $_ENV["DATABASE_HOST"];
  $dbname = $_ENV["DATABASE_NAME"];
  $dbuser = $_ENV["DATABASE_USER"];
  $dbpass = $_ENV["DATABASE_PASS"];   

  try{
    $dbc = new PDO("mysql:dbname=$dbname;host=$host;port=3306;user=$dbuser;pass=$dbpass");
    $dbc->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch(PDOException $e) {
    echo "Conneciton failed: " . $e->getMessage() . "<br/>";
  }  
?>

После выполнения всего вышеперечисленного я получаю следующую ошибку:

Warning: require(/var/www/html/include/vendor/autoload.php): failed to open stream: No such file or directory in /var/www/html/include/database.php on line 2

Fatal error: require(): Failed opening required '/var/www/html/include/vendor/autoload.php' (include_path='.:/usr/local/lib/php') in /var/www/html/include/database.php on line 2

Я попытался изменить путь поставщика в файле data.php, но все равно получаю ту же ошибку.

Я попытался запустить команду композитора внутри папки www, но все равно получаю ту же ошибку.

Что я сделал не так и как это исправить?

Как выглядят монтируемые тома в вашем docker-compose.yml файле?

maiorano84 09.06.2024 05:03

В сообщении об ошибке говорится, что вы пытаетесь открыть каталог поставщика внутри include, где его нет. Чтобы исправить это, нужно исправить путь в файле data.php, но вы говорите, что сделали это, и все равно получаете то же сообщение об ошибке. Вы действительно имеете в виду, что изменения вашего кода не улавливаются интерпретатором PHP?

Álvaro González 10.06.2024 11:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
87
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку файл data.php находится в каталоге include, вам нужно вернуться на уровень назад в операторе require, чтобы попасть в каталог поставщика, например:

require __DIR__ . "/../vendor/autoload.php";

Некоторые примечания в произвольном порядке:

  • Очень сложно поддерживать зависимости PHP как отдельные команды Docker. Почему бы вам просто не зафиксировать composer.json и (важно) composer.lock файлы и не запускать composer install только из Docker?

  • Вы запускаете команды Composer там, где хотите, чтобы каталог vendor находился. PHP не заботится о таком местоположении, пока у процесса PHP есть разрешение на чтение каталога (а у процесса Composer есть разрешение на его запись). Обычно делать каталог общедоступным — плохая идея, поэтому не публикуйте его в корне документа вашего веб-сервера (думаю, в вашем случае это /SITE/www), но то же самое можно сказать и о большинстве обычных PHP-кодов (/SITE/www/include не является хорошее расположение). Сходным образом:

    Я могу создать файл .env в своей папке www вместе с другими веб-файлами.

    Ты можешь, но, пожалуйста, не делай этого. Если вы это сделаете, любой сможет загрузить учетные данные вашей базы данных. Создайте файл где-нибудь еще.

  • Вызов autoload.php из каждого исходного файла не является неправильным, но это отчасти лишает удобства автозагрузчика классов. Почему бы вам не вызвать это в своем индексном файле?

  • __DIR__ — это каталог файла, в котором вы его физически записываете, он не имеет никакого отношения к вашему проекту или корню документа.

  • Не перехватывайте исключения, чтобы перевести их в обычный вывод программы. Поступая так, вы убиваете функции отчетов об ошибках. Если вы не знаете, что с ними делать, лучший подход — ничего не делать.

  • Делайте одно дело за раз. Сначала убедитесь, что вы можете загрузить библиотеку и заставить ее работать с вашим кодом, а затем позаботьтесь об автоматизации Docker.

Ответ принят как подходящий

Я больше не получал ошибку, когда переместил папку Vendor, композитор.json и композитор.lock в папку WWW.

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