Drupal复制站点后settings.php数据库配置修改不生效求助
嘿,我碰到过好几个朋友遇到这种情况,咱们一步步排查,肯定能揪出问题!
先确认你改对文件了吗?
Drupal有时候会根据站点域名加载不同目录下的配置文件,比如sites/你的域名/settings.php,优先级比sites/default/settings.php高。另外如果存在sites/default/settings.local.php,这个文件里的配置会直接覆盖主settings.php的内容,你之前提到检查了local.settings,应该是这个文件吧?
实在拿不准的话,临时在站点根目录的index.php里加一行代码:print_r(DRUPAL_ROOT . '/' . conf_path() . '/settings.php'); exit;访问站点就能看到实际加载的配置文件路径了,用完记得删掉这两行哦!
缓存!缓存!缓存!重要的事说三遍
Drupal的配置缓存会把数据库连接信息存在缓存里,哪怕你改了settings.php,缓存没清的话还是会用旧的。- 如果能访问Drush命令行,直接跑
drush cache:rebuild(Drupal 8及以上版本)或者drush cc all(旧版本)。 - 没Drush的话,手动删除
sites/default/files/php/twig和sites/default/files/config_*目录下的所有文件;另外如果服务器开了OPcache,得重启PHP服务或者刷新OPcache(可以在phpinfo里找OPcache的刷新入口)。
- 如果能访问Drush命令行,直接跑
检查文件权限和所有权
如果settings.php的权限不对,Drupal可能读不到你修改的内容,甚至会 fallback 到默认配置。一般把权限设为644,所有权改成服务器的Web用户(比如www-data、apache,根据你的服务器环境调整):chmod 644 sites/default/settings.php chown www-data:www-data sites/default/settings.php有没有模块或配置系统覆盖了你的设置?
- 有些自定义模块或者 contrib 模块可能会硬编码数据库连接信息,你可以用命令搜一下整个代码库:
grep -r "\$databases" sites/,看看有没有其他地方定义了$databases数组。 - 对于Drupal 8+,如果之前导出过配置到
sites/default/config/sync,里面的core.database.yml会覆盖settings.php的配置,你可以暂时把这个目录重命名,看看站点会不会用你新改的配置。
- 有些自定义模块或者 contrib 模块可能会硬编码数据库连接信息,你可以用命令搜一下整个代码库:
验证数据库配置本身是否有效
虽然你填错误信息没反应,但还是可以写个简单的PHP脚本测试连接,比如在站点根目录建test_db.php:<?php $conn = mysqli_connect('my_db_host', 'my_db_user', 'my_db_password', 'my_db_database', 3306); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } echo "数据库连接成功!"; mysqli_close($conn); ?>访问这个脚本,确认你的数据库信息是能正常连接的,排除数据库本身的问题。
检查服务器环境变量
有些服务器会用环境变量来配置数据库,比如在php.ini或者Apache虚拟主机配置里定义了DB_NAME、DB_USER等变量,而你的settings.php里可能用了getenv('DB_NAME')这类代码来读取环境变量,而不是硬编码的值。可以看看settings.php里有没有类似的代码。
先从前面两个步骤开始排查,这是最常见的原因,大概率能解决问题!
内容的提问来源于stack exchange,提问作者Amy

