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命令,但仍出现相同错误。请问哪里操作错误,该如何解决?
解决方案
核心问题:路径错误
- autoload.php路径错误:
database.php里的__DIR__指向/var/www/html/include/,但vendor文件夹在SITE根目录,需要向上跳转多级目录才能访问。 - .env文件路径错误:
createImmutable(__DIR__)指向include目录,但.env实际在www目录下,导致无法读取。 - 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
相关产品推荐
相关产品推荐

