我們以前做的系列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的查詢特别多而且慢,可以把系列站的這兩個表也合并。
评论