多語言支持是Drupal的重要特點,也是我們選擇Drupal的重要原因,我們開發的Drupal網站很多都是帶有多語言的,這其中就需要放置多個語言之間的互相鍊接,我們開始是使用的Language Icons第三方模塊,後來又在手機版和響應式設計中使用了Language Switcher Dropdown,一直到現在。
最近在轉UTF8MB4支持的過程中,把一些老舊的MyISAM引擎表轉為了InnoDB引擎,應該更強大,但我們應用的場景是讀取遠遠大于寫入,不能很好發揮InnoDB的優勢,反而在數據統計方面表現比MyISAM更慢,引起阿裡雲RDS負載(特别是IOPS)升高,需要進行一些優化調整,在RDS參數盡量調整後還得看Drupal本身的優化。
以前使用Devel的時候發現過頁面中有很多drupal_lookup_path的SQL語句,這次又仔細查看,一個典型多語言網站頁面大約有100個SQL查詢,其中居然有差不多50個drupal_lookup_path,這是因為我們有些站加了50種多語言支持,在語言切換這個Block中需要計算各種語言的鍊接地址,就産生了如此多的drupal_lookup_path,雖然每個執行時間很短,但數量也太多了一些。前幾天想過一個辦法《減少Drupal網站path查找數據庫查詢負載》,不是很正規,幾天後又嘗試了下面的辦法。
我們的“多語言”網站并非嚴格意義上的每種語言都有不同内容、不同網址,而是都采用了'und'未定義語言的方式,存儲内容和網址後面部分都是一樣的,隻是顯示模闆和網址前綴上有不同。所以完全可以抛棄标準多語言鍊接切換的第三方模塊,而是自己來做一個這種多語言鍊接Block,一個頁面可以減少幾十次的drupal_lookup_path查詢。
可以直接在網站中創建Block并輸入PHP代碼來實現,也可以使用自定義模塊中添加Block定義的方式,後者代碼實例如下:
function my_module_block_info() { $blocks=array(); $blocks['language_switcher']=array( 'info'=> t('Language').' '.t('Switcher'), 'cache'=>DRUPAL_NO_CACHE, 'weight'=>0, 'status'=>1, 'region'=>'sidebar_first', 'visibility'=>BLOCK_VISIBILITY_NOTLISTED, 'pages'=>'', ); return $blocks; } function my_module_block_view($delta = '') { $block=array(); switch($delta){ case 'language_switcher': $block['subject'] = t('Languages').' 🌐'; if(user_access('access content')){ $server_name=$_SERVER['SERVER_NAME']; $request_uri=$_SERVER['REQUEST_URI']; $languages = language_list('enabled'); $languages_array = $languages[1]; $language_default = language_default($property = 'language'); global $language; $language_current = $language->language; $language_name = $language->name; $language_native = $language->native; //$output = "<form action='$request_uri' method='post'>\n"; $output = ''; $output .= "<select style='width:165px' name='language_switcher_select' onChange=\"window.open(this.options[this.selectedIndex].value,'_self')\">\n"; if ($language_current == $language_default) { $request_uri_without_language = $request_uri; } else { $request_uri_without_language = substr($request_uri,strlen($language_current)+1); } if ($request_uri_without_language == '') $request_uri_without_language = '/'; foreach($languages_array as $key => $value) { $value_native = $value->native; if ($key == $language_current) { $output .= "<option value='$request_uri' selected='selected'>$value_native</option>\n"; } else { if ($key == $language_default) { $request_uri_new = $request_uri_without_language; } else { $request_uri_new = "/$key$request_uri_without_language"; } $output .= "<option value='$request_uri_new'>$value_native</option>\n"; } } $output .= "</select>\n"; $output .= "<img src='/sites/all/modules/languageicons/flags/$language_current.png' width='16' height='12' alt='$language_native' title='$language_name' />\n"; //$output .= "<noscript><input type='submit' name='op' value='Go' /></noscript>\n"; //$output .= "</form>\n"; $block['content']=$output; } break; default: } return $block; }
上面是我在自定義模塊my_module.module中寫的Block定義,在實際中測試了可以使用,語言切換功能與第三方模塊的基本一緻,SQL語句減少了很多。
评论