优化多语言支持功能

问题描述:

我为自己的一个项目创建了自己的多语言支持。我有3个不同的数据库表:languages,languages_variableslanguages_words(如下所示)。优化多语言支持功能

CREATE TABLE IF NOT EXISTS `languages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_user` int(11) NOT NULL, 
    `data_name` text NOT NULL, 
    `data_currency` text NOT NULL, 
    `is_standard` tinyint(4) NOT NULL, 
    `data_note` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) 

CREATE TABLE IF NOT EXISTS `languages_variables` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data_name` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) 

CREATE TABLE IF NOT EXISTS `languages_words` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_language` int(11) NOT NULL, 
    `id_variable` int(11) NOT NULL, 
    `data_name` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) 

当我想提取特定字符串的网站,我将使用一个名为language()功能(如下图所示)。下面代码中的$user获取有关已登录用户的信息,例如用户选择的语言。 (menu_about只是一个变量的例子)。

function language($variable) { 

    global $user; 


    # DATABAS (kontrollera) 
    $check_language = sql("SELECT COUNT(lv.data_name) 

          FROM languages AS l 
          JOIN languages_variables AS lv 

          JOIN languages_words AS lw 
          ON l.id = lw.id_language 

          WHERE lv.data_name = :variable 
          AND lw.id_language = :idlanguage 
          ", Array('idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language']), 
            'variable' => $variable), 'count'); 

    # DATABAS (räkna) 
    $count_words = sql("SELECT COUNT(lw.id) 
         FROM languages_words AS lw 
         JOIN languages_variables AS lv 
         ON lw.id_variable = lv.id 
         WHERE lw.id_language = :idlanguage 
         AND lv.data_name = :variable 
         ", Array('idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language']), 
           'variable' => $variable), 'count'); 



    # KONTROLL 
    if($check_language == 0 OR $count_words == 0) { 

     return $variable; 


    # KONTROLL 
    } else { 

     # DATABAS (hämta) 
     $get_languages = sql("SELECT *, 
            lv.data_name AS name_variable, 
            lw.data_name AS name_translation 

           FROM languages AS l 
           JOIN languages_variables AS lv 

           JOIN languages_words AS lw 
           ON lv.id = lw.id_variable 

           WHERE lv.data_name = :variable 
           AND lw.id_language = :idlanguage 
          ", Array('variable' => $variable, 
             'idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language']))); 


     # LOOP 
     foreach($get_languages AS $language) { 

      # KONTROLL 
      if($language['name_variable'] == $variable) { 
       return $language['name_translation']; 

      # KONTROLL 
      } else { 
       return $variable; 
      } 

     } 

    } 

} 

问题是,网站加载非常缓慢,所有在language()内的东西。特别是当我将列出数据库中的很多项目(例如一个循环)。加载速度从2秒到10秒不等。

是否有另一种更好,更快捷的方式来获得所选的语言字符串?

UPDATE我的加载速度从7-8秒降到3-4秒。但它仍然太慢。

function language($variable) { 

    # DATABAS (hämta) 
    $language = sql("SELECT lv.data_name AS name_variable, 
          lw.data_name AS name_word 

        FROM languages AS l 
        JOIN languages_variables AS lv 
        JOIN languages_words AS lw 

        ON lv.id = lw.id_variable 
        WHERE lv.data_name = :variable 
        AND l.id = :idlanguage 
        ", Array('variable' => $variable, 
          'idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language'])), 'fetch'); 


    return $language['name_word']; 

} 

我正在考虑使用文件(sv.php,en.php等)而不是数据库。但是,那么用户不能从浏览器翻译网站(如果我不牺牲自己几个小时的血液,汗水和眼泪)。

首先分析构建Xhprof来验证PHP性能。对于SQL调用Google Chrome有一个内置的Web检查器,可以让您知道每个组件的使用时间(Firebug for Firefox)。

如果您发布日志,它可以大大提高相关领域的改进。

+0

谢谢,但我知道问题所在,因为我已经测试过删除函数'language()'中的所有内容,只保留'return $ variable;'。之后,该网站的速度更快了。无论如何。我做了你的建议(在Google Chrome浏览器中查看检查员),我只能找到网络和资源,而不是你所说的。 – Erik

+0

有一个常用的加入基于:https://developers.google.com/speed/pagespeed/ – Oliver

+0

对不起,一个缓慢的激光。我在哪里可以找到这些日志?你给我的链接只允许我测试我的网站 - 不保存一些日志。你提到关于网络检查员的是什么?哪里可以找到测试SQL调用并保存日志? – Erik