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






Поскольку файл 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.
Как выглядят монтируемые тома в вашем
docker-compose.ymlфайле?