PHP如何判断运行环境为Docker或XAMPP以动态配置数据库host
方案1:通过内置环境标识判断(无需修改启动命令,最便捷)
Docker运行的容器默认会在根目录创建.dockerenv标识文件,XAMPP本地环境不存在该文件,直接基于该特征判断即可:
<?php // 判断是否运行在Docker容器中 $host = file_exists('/.dockerenv') ? 'host.docker.internal' : 'localhost'; $name = "test"; $user = "root"; $passwort = ""; try { $mysql = new PDO("mysql:host=$host;dbname=$name", $user, $passwort); } catch (PDOException $e) { echo "SQL Error: ".$e->getMessage(); } ?>
该方案无需修改任何Docker启动参数或XAMPP配置,标准Docker环境下都可以正常生效。
方案2:通过自定义环境变量判断(灵活度更高,适合多环境扩展)
如果后续需要兼容测试、生产等更多环境,推荐用自定义环境变量做判断,配置方式如下:
- 修改Docker启动命令,注入环境标识:
也可以直接注入数据库host,后续修改无需动业务代码:docker run -dp 9000:80 --name php-app -e APP_ENV=docker phpdocker run -dp 9000:80 --name php-app -e DB_HOST=host.docker.internal php - PHP代码中读取环境变量动态赋值:
<?php // 优先读取环境变量中的DB_HOST,不存在则默认使用localhost $host = getenv('DB_HOST') ?: 'localhost'; // 也可以按环境标识判断 // $host = getenv('APP_ENV') === 'docker' ? 'host.docker.internal' : 'localhost'; $name = "test"; $user = "root"; $passwort = ""; try { $mysql = new PDO("mysql:host=$host;dbname=$name", $user, $passwort); } catch (PDOException $e) { echo "SQL Error: ".$e->getMessage(); } ?>
该方案支持把数据库账号、密码等敏感信息都放到环境变量中,安全性更高,扩展多环境时不需要修改业务逻辑。
可选兜底方案:连接失败自动降级
如果担心前面的判断逻辑出现异常,可以加降级兼容逻辑,依次尝试不同host连接:
<?php $hosts = ['host.docker.internal', 'localhost']; $name = "test"; $user = "root"; $passwort = ""; $mysql = null; foreach ($hosts as $host) { try { $mysql = new PDO("mysql:host=$host;dbname=$name", $user, $passwort); break; } catch (PDOException $e) { continue; } } if (!$mysql) { echo "SQL Error: 所有数据库主机都连接失败"; } ?>
内容的提问来源于stack exchange,提问作者Moti
相关产品推荐
相关产品推荐

