这个问题主要出现在更新网站内容,优化删除不使用的模块时出现的问题。最早发现问题的是91上7654端口的数据库,经过讨论分析后认为Tripal galaxy模块和slide show等模块功能有局限、应用价值不高,于是在模块所在路径下 /var/www/html/sites/all/modules 删除模块文件夹。 但是在网站清除缓存后就出现了报错,在Drupal官方社区中有详细信息描述:If you see a PHP warning such as "The following module is missing from the file system..." (or similar) on your site, this page explains how to fix it.
针对于Drupal7有两种解决方案:
在选取解决方案前需要对出现问题的模块进行评估,首先要确定能否找到原有下载模块的路径(GitHub等),能够下载到跟删除前一样的模块文件,其次要确定这个模块接下来是否还会使用。
如果说能够找到原有模块的下载途径下载跟原来安装模块一样的模块文件,或者不确定要完全从Drupal里面完全移除此模块来解决上述报错,可以选用方案一:
在原始安装路径下以同样的方式下载再次安装此模块(这步就要求在之前安装这个模块时候有详细的笔记能够支持进行还原操作,否则安装版本等不一致的话也是没法解决这个问题的),接着到页面端的modules下面,取消这个模块的勾选,由前端进行卸载保存操作后,再次到后端进行删除以及清理缓存操作即可解决问题。
PS:这个解决方法给我们的提醒就是不要直接删除模块文件去卸载模块,这样的操作虽然删除了模块的所有文件,但是在加载模块时,会把相关模块信息加载到Drupal自身的库中,导致Drupal启动时依然会去原始位置搜索模块,从而导致报错,于是正确卸载删除模块的操作方法是前端依次取消所有依赖模块的勾选卸载,再删除模块文件、清除缓存。
如果说找不到原有模块的下载途径,或者确定要完全移除此模块来解决上述报错,可以选用方案二:
可以使用Drush命令:
drush sql-query "DELETE from system where type = 'module' AND name IN ('old_module1','old_module2');"
清除旧的模块然后清除缓存使操作生效:
drush cc all
接着自定义一个模块编写更新的hook钩子,使用类似下面的代码:
/**
* Delete {system} records for long-lost modules.
*/
function MYMODULE_update_7100() {
$modules = array(
'old_module1',
'old_module2',
'old_module3',
);
db_delete('system')
->condition('name', $modules, 'IN')
->condition('type', 'module')
->execute();
}
这样当 update.php 运行时它就会删除缺失的模块
针对Drupal8/9出现同样的问题在社区中也有对应的解决方法,详情请见:https://www.drupal.org/node/2487215