Answers:
您只需要将模块移动到新位置并重建注册表即可。注册表重建时,将更新模块的路径。检查registry_rebuild()
。
重新扫描模块中或包含目录的所有代码,将每个接口或类的位置存储在数据库中。
虽然,我建议您在测试之前备份数据库。
如果您使用的是drush,也可以使用以下命令重建注册表:
drush cc registry
您也可以安装registry_rebuild
drush命令:
// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr
DELETE FROM registry_file;
,并增加了呼叫rebuild_registry()
我page.tpl.php
。
我从本地生产环境中恢复了一个备份,并试图移动某些东西并命中admin / modules或运行registry_rebuild(),但它并没有阻止引发致命错误。这对我来说很有意义,因为某些模块可能在其hook_init()中使用了include或其他内容,或者您可能设置了依赖于模块的菜单路由器路径集或Drupal在引导程序中找不到的include路由器。最终,这就是我所做的(您的路径可能不同):
第1步:将网站/所有/模块替换为网站/所有/模块/贡献
UPDATE system SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
步骤2:将site / all / modules / contrib替换为site / all / modules / custom的自定义命名空间模块
UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE filename LIKE '%my_custom_namespace_%';
步骤3:将开发人员模块移至site / all / modules / dev
UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE filename LIKE '%devel%';
第4步:清除缓存,以便正确引导
TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path
注意:如果您使用自定义模块或诸如LoginToboggan之类的工具来处理403(拒绝访问),并且在此过程中已注销,则可能需要更新表中的include_file
列menu_roter
以使用包含文件的新路径。这可能是罕见的情况。
UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'
一旦运行了这些查询(仅需一秒钟),请点击admin / config / development / performance并清除缓存,以便重新构建菜单路径。
update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.admin.inc' WHERE path = 'admin/config/system/logintoboggan'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'toboggan/revalidate/%'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'user/validate/%/%/%';
尝试使用Mark Sonnabaum的出色工具:Drush Rebuild Project Paths。它使过程自动化。对我来说很棒。当然,使用Drush。
我将建议您在站点数据库的副本上尝试此建议。
作为记录,有一个很棒的drush命令来重建注册表:http ://drupal.org/project/registry_rebuild
项目页面中有很多信息。
sites/all/modules
必须移至contrib
子目录。我所drush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
drush rr --fire-bazooka
会导致错误,但是drush rr
很好。
首先,请始终备份数据库,这样做很简单,如果出现问题并且没有备份,您会踢自己。
我不确定是否禁用模块是否重要;您可能要这样做,以防万一。然后执行以下操作:
全部做完!Drupal将重新搜索所有已安装的模块。
您可以使用注册表重建模块,该模块通过Drush RR
命令与Drush集成。
基本上,您需要执行以下步骤:
我首先通过DrupalEasy Podcast#133学习/发现它,它进一步说明了如何使用此模块/ drush cmd。
PS:当然,首先要对您的网站进行备份...
访问/ admin / build / modules,它将重建系统表中的路径。有时drupal不能再引导,因此这种解决方案在这种情况下不起作用。如果它不起作用,则可以使用 上一个答案中所述的Drush Rebuild Project Paths。不过,您必须在中断引导程序之前添加新的drush命令。要添加新命令,请查看自述文件的 “命令”部分
我不确定100%的真实drupal-esk答案,但根据我的经验:
通过FTP传输到服务器时,我不小心将一个自定义模块文件夹移动到了另一个自定义模块文件夹中。他们俩仍然工作。即使它在另一个模块的文件夹中,Drupal似乎也已经将其识别为一个单独的模块。我不必禁用该模块。
**我移动的该模块没有.install文件,因此不确定是否重要。
Drupal发行版不能很好地解决这个问题,因此最近在无意中在Panopoly网站上获得了Entity API副本后sites/all/
,这些都没有用。注册表重建,加载模块页面以及其他所有内容均导致致命错误。
如果您必须移动诸如Entity API之类的东西,而Panopoly中的其他许多模块都需要,则禁用该模块并不简单。
为了解决这个问题,对于Entity API,您可以执行以下操作:
更新系统表中的路径:
UPDATE `system`
SET `filename` = REPLACE(
`filename`,
'sites/all/modules/entity',
'profiles/panopoly/modules/contrib/entity'
);
然后重建注册表:
drush rr
Drupal 7
首先试试drush rr
。
如果不起作用,请在移动文件后在Drupal根目录中尝试以下Drush命令:
drush sqlq "TRUNCATE cache; TRUNCATE cache_bootstrap;"
php -r "define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); registry_rebuild(); registry_update(); cache_clear_all();"
drush -y cc all
如果上述方法不起作用,请通过以下方法找到仍包含有关路径的旧信息的表:
drush --ordered-dump sql-dump | grep "sites/all/modules" # Change the path to the old one.
如果未找到,则意味着它是您的外部缓存。
如果是这样,请不要忘记重新启动它们,例如:
killall -HUP memcached
drush eval "function_exists('xcache_clear_cache') && xcache_clear_cache();"
查看更多:在Drupal中使用什么方法清除缓存?
或者,您可以在移动文件后尝试以下MySQL查询:
UPDATE system SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
filename LIKE "sites/all/modules/%" AND type = "module"
AND name IN ("my", "module", "whose", "path", "changed");
UPDATE registry SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
filename LIKE "sites/all/modules/%"
AND module IN ("my", "module", "whose", "path", "changed");
建议将模块移动到contrib / dev / patched / custom子文件夹中。但是,没有性能提升,这是出于实用和美观的原因。这将使将来的开发人员的生活更加轻松。
您可以在实时站点上毫无问题地将大多数contrib模块移动到子文件夹。之后,您应该清除缓存。如果您不使用drush并发现无法再访问缓存清除页面,则必须访问/update.php或手动截断缓存表。移动实体API模块时,我只需要做最后一件事。
从技术上讲,可以移动核心模块,但是我不建议这样做,也没有看到任何有效的理由。
更新:移动诸如实体API之类的模块可能需要重建注册表。签出registry_rebuild页面。
registry_file
表,这将迫使drupal重新扫描所有文件并重建表。