两个使用PostgreSQL的DDEV项目同时运行出现异常干扰如何排查?
问题根源
1. 配置逻辑语法错误
两个项目的settings.ddev.php中主机侧Drush判断逻辑写法错误,原代码:
if (empty(getenv('DDEV_PHP_VERSION') && getenv('IS_DDEV_PROJECT') == 'true')) {
括号位置错误导致逻辑完全不符合预期,会误将容器内运行的Web请求判定为本地Drush执行,把数据库地址指向127.0.0.1,进而随机连接到本机端口映射的另一个项目PostgreSQL实例,这是页面刷新随机报错/恢复的核心原因。
2. 本地端口配置错误
- Drupal 7的
settings.ddev.php中将本地Drush连接端口写为Drupal 9对应的32784,导致主机侧执行Drupal 7的drush sqlc时默认连接到Drupal 9的数据库,因此会看到Drupal 9的表结构。 - Drupal 9的
settings.ddev.php中将本地端口设为-1属于无效值,会进一步加剧连接混乱。
3. 存储独立无需担心
从你提供的docker volume ls结果看,两个项目的PostgreSQL存储卷是完全独立的,不存在共享存储的问题,此前的数据交叉是连接了错误数据库实例导致的,不会出现存储层混写。
修复步骤
- 修复两个项目
settings.ddev.php的判断逻辑,替换原if条件为:
// 仅当在主机侧执行Drush时才使用本地地址和端口 if (empty(getenv('DDEV_PHP_VERSION')) && getenv('IS_DDEV_PROJECT') == 'true') {
- 修正Drupal 7的本地端口配置,将
$port = 32784;改为$port = 32785; - 修正Drupal 9的本地端口配置,将
$port = -1;改为$port = 32784; - 分别在两个项目目录执行
ddev restart重启项目使配置生效 - 验证:同时启动两个项目后,分别执行
ddev drush sqlc查看表结构,确认不会交叉显示对方的表,多次刷新前端页面确认无报错即可。
内容的提问来源于stack exchange,提问作者felmab
相关产品推荐
相关产品推荐

