PHP не читает файл .env

Я использую PHP с PDO для подключения к моей базе данных.

Я хочу начать использовать переменные среды, поэтому я использовал следующую команду терминала:

composer require vlucas/phpdotenv

Мой файл .env теперь содержит следующие значения:

DATABASE_HOSTNAME=db
DATABASE_NAME=myDb
DATABASE_USERNAME=user 
DATABASE_PASSWORD=test 

Мой тестовый файл подключения к базе данных выглядит следующим образом:

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

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$host = getenv("DATABASE_HOSTNAME");
$dbname = getenv("DATABASE_NAME");
$dbuser = getenv("DATABASE_USERNAME");
$dbpass = getenv("DATABASE_PASSWORD");

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

Я получаю следующую ошибку:

Conneciton failed: SQLSTATE[HY000] [2002] No such file or directory

Я добавил этот код в файл подключения к тестовой базе данных:

echo "X" . getenv('X');
echo "host is " . $host;

В терминале ввожу: php test.php

И это звучит следующим образом:

Xhost is %

Вот скриншот:

Что я делаю не так?

Вероятно, актуально в вашем случае: github.com/vlucas/…. Доктор, не используйте getenv, а вместо этого используйте $_ENV[...].

Matthew 24.06.2024 19:12

если вы используете php с Apache в качестве веб-сервера, я бы использовал доступные там встроенные переменные env вместо внешней библиотеки в php. таким образом вокруг не будет файлов .env

Lelio Faieta 24.06.2024 19:14

Не имеет отношения к вашей проблеме, но getenv возвращает false, если переменная не существует, и когда вы объединяете ее со строкой X, она преобразуется в пустую строку "". Судя по вашему мнению, вы это знаете, но я просто хотел предупредить вас, что это может привести к определенному безумию при отладке, особенно если вам нужно поддерживать пустые переменные ENV (по какой-либо причине).

Chris Haas 24.06.2024 19:25

@Мэтью, я внес это изменение, и теперь оно работает. Примечание: это та часть программирования, которая меня раздражает; постоянные (а иногда и ненужные) изменения в синтаксисе, устаревания и т. д. Хотя я понимаю, что это часть области технологий, меня это крайне раздражает. Я должен был стать шеф-поваром. Кстати, вы хотели опубликовать ответ? Я приму это.

John Beasley 24.06.2024 19:38

Это хорошая гарантия занятости: половина вашего времени уходит на исправление того, что уже работает.

Matthew 24.06.2024 20:08
Стоит ли изучать 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 и хотите разрабатывать...
1
5
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это связано с тем, что getenv и putenv по умолчанию не заполняются библиотекой Dotenv.

Вместо этого следует использовать $_ENV для чтения переменных при использовании функции createImmutable, в противном случае ознакомьтесь с документацией по адресу https://github.com/vlucas/phpdotenv?tab=readme-ov-file#putenv-and-getenv

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