You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下PHP使用phpdotenv出现路径错误,如何解决?

问题:phpdotenv加载失败的路径问题

我要添加phpdotenv,执行终端命令:composer require vlucas/phpdotenv,但不确定该在哪个目录执行。

初始文件夹结构:

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

在SITE根目录执行命令后,生成了vendor文件夹及composer.json:

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

更新后的文件夹结构:

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

我在www文件夹中创建了.env文件:

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

随后在database.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 "Connection 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

我尝试调整database.php中的vendor路径,也尝试在www目录下执行composer命令,但仍出现相同错误。请问哪里操作错误,该如何解决?


解决方案

核心问题:路径错误

  1. autoload.php路径错误:database.php里的__DIR__指向/var/www/html/include/,但vendor文件夹在SITE根目录,需要向上跳转多级目录才能访问。
  2. .env文件路径错误:createImmutable(__DIR__)指向include目录,但.env实际在www目录下,导致无法读取。
  3. PDO连接变量错误:代码中定义了$dbhost,但连接时用了未定义的$host,同时DSN写法不符合规范。

分步解决(推荐保持composer在根目录安装)

修改database.php中的路径和连接代码:

<?php
// 从include目录向上跳两级,到SITE根目录加载autoload.php
require __DIR__ . "/../../vendor/autoload.php";

// 指定.env文件所在的www目录(从include向上跳一级)
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . "/../");
$dotenv->load();   
 
$dbhost = $_ENV["DATABASE_HOST"];
$dbname = $_ENV["DATABASE_NAME"];
$dbuser = $_ENV["DATABASE_USER"];
$dbpass = $_ENV["DATABASE_PASS"];   

try{
  // 修正变量名$host为$dbhost,同时规范PDO连接参数写法
  $dbc = new PDO("mysql:dbname=$dbname;host=$dbhost;port=3306", $dbuser, $dbpass);
  $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage() . "<br/>";
}  
?>

备选方案:将composer安装到www目录

如果想把依赖放在web根目录下,进入www目录执行composer require vlucas/phpdotenv,此时vendor会生成在www目录内,再修改database.php:

<?php
// 从include目录向上跳一级到www目录加载autoload.php
require __DIR__ . "/../vendor/autoload.php";

// 指定.env文件所在的www目录
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . "/../");
$dotenv->load();   

// 后续代码同上,注意修正变量和PDO连接写法
?>

额外检查

  • 确认docker-compose.yml的目录映射规则,确保本地SITE根目录或www目录与容器内路径对应一致。
  • 保证.env文件权限正确,PHP进程拥有读取该文件的权限。

内容的提问来源于stack exchange,提问作者John Beasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:33:19