我们以前做的系列Drupal网站一般都是共享代码目录、分开创建独立的数据库,因为一般都是禁止匿名用户注册的,所以只是最初设立几个管理员就可以,也还方便。不过为了考虑以后开放用户注册,系列网站的共享用户数据库就有必要了。今天去尝试了一些,可以比较方便地在settings.php中进行如下设置:
Drupal 7:
$databases['default']['default']['prefix']['default'] = ''; $databases['default']['default']['prefix']['users'] = 'mingluji_com.'; $databases['default']['default']['prefix']['users_roles'] = 'mingluji_com.'; $databases['default']['default']['prefix']['sessions'] = 'mingluji_com.'; $databases['default']['default']['prefix']['role'] = 'mingluji_com.'; $databases['default']['default']['prefix']['authmap'] = 'mingluji_com.'; $cookie_domain = '.mingluji.com';
或者写为:
$databases = array( 'default' => array( 'default' => array( 'prefix' => array( 'default' => '', 'users' => 'mingluji_com.', 'sessions' => 'mingluji_com.', 'role' => 'mingluji_com.', 'authmap' => 'mingluji_com.', 'users_roles' => 'mingluji_com.', ), ), ), ); $cookie_domain = '.mingluji.com';
Drupal 6:
$db_prefix['default'] = ''; $db_prefix['users'] = 'mingluji_com.'; $db_prefix['sessions'] = 'mingluji_com.'; $db_prefix['role'] = 'mingluji_com.'; $db_prefix['authmap'] = 'mingluji_com.'; $db_prefix['users_roles'] = 'mingluji_com.'; $cookie_domain = '.mingluji.com';
或写为:
$db_prefix = array( 'default' => '', 'users' => 'mingluji_com.', 'sessions' => 'mingluji_com.', 'role' => 'mingluji_com.', 'authmap' => 'mingluji_com.', 'users_roles' => 'mingluji_com.', ); $cookie_domain = '.mingluji.com';
可以做到一个系列或者同一台服务器上Drupal站点共用用户数据库,跨服务器还不行,这和mediawiki类似,wiki站也是同一台服务器上的用户库可以共享。
《drupal建立多站点共享用户数据》 这篇文章介绍还比较详细,可以参考。
补充:在设置共享用户数据库之前,最好先检查一遍以前的用户设置情况,可能有用户uid不同的情况,以及可能有入侵账号的情况。可以批量运行下面这句看看:
drush user-information 1,2,3,4,5
1一般都是James Qi,因为是我最初设置的
2或者3一般是Webmaster,这是设置的第一个用户,但有的是2,有的是3
4或者5一般应该不存在,会报错,如果有用户就可能是入侵的
drupal 6/7运行上面这句还有点不一样,drupal 6运行如果遇到报错就只报错不显示找到的其它的,drupal 7运行如果遇到报错除了报错以外也显示找到的其它的。如果4、5报错不显示的话,先排除有4、5的可能,再运行drush user-information 1,2,3。
如果整个系列的各个站点运行的结果全部是统一的,例如:
1是James Qi
3是Webmaster
2,4,5不存在
那就直接合并就可以,不会有问题。
如果运行结果不统一,例如有些站点Webmaster是2,有些站点是3,那就还需要特别处理一下,在合并后的用户数据表中把uid=2和uid=3都加上用户,否则缺了某一个用户可能造成这个用户编辑的页面报错(找不到对应的用户名)。这在drupal7.mingluji.com这个系列合并用户数据库的时候就遇到,因为各届广交会的站点不是统一建的,有些用户uid不统一。 Webmaster ID不统一的问题还有一个办法,在drupal 6/7的操作中直接在phpmyadmin中修改users表,把Webmaster的uid改为2,另外在users_roles表中,也把对应的uid改为2,再在node表和node_revisions这两个表中,搜索uid=以前数字的,也改为2,这样就全部改完了,再进行合并不会有问题。
如果找到4、5等其它的账号(例如:User ID: 3,User name: drupaldev,User roles: authenticated user megauser,这个3是入侵的,我们自己没有设置过drupaldev,也没有megauser这个组),要去看看,把这些入侵的账号屏蔽或者删除掉(drush user-block屏蔽用户、drush user-cancel删除用户、drush user-remove-role去掉角色组)。多余的注册用户也可能是这个站开始设置网站的时候,还没有来得及关闭注册,就有一些注册的了,正常注册过的用户可以忽略掉,应该不多,而且他们也无法发布内容和评论,都是几年前注册的,可以删除,也可以屏蔽,或者搁置不管。
另外,再在合并后统一用户数据库的站点上设置一个action和对应的trigger,当有新用户注册的时候会发邮件通知管理员,这样就可以防止以后被入侵后还不知道。
2015-7-9补充:还有表可以合并:role_permission,但如果系列站之间需要设置的权限不一样的话(例如子站与总站之间开启的模块不一致的情况下),那还不能合并。
另外,devel排查性能发现多语言网站对locales_source、locales_target的查询特别多而且慢,可以把系列站的这两个表也合并。
评论