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

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:通过自定义环境变量判断(灵活度更高,适合多环境扩展)

如果后续需要兼容测试、生产等更多环境,推荐用自定义环境变量做判断,配置方式如下:

  1. 修改Docker启动命令,注入环境标识:
    docker run -dp 9000:80 --name php-app -e APP_ENV=docker php
    
    也可以直接注入数据库host,后续修改无需动业务代码:
    docker run -dp 9000:80 --name php-app -e DB_HOST=host.docker.internal php
    
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:04