优化多语言支持功能
问题描述:
我为自己的一个项目创建了自己的多语言支持。我有3个不同的数据库表:languages
,languages_variables
和languages_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)。
如果您发布日志,它可以大大提高相关领域的改进。
谢谢,但我知道问题所在,因为我已经测试过删除函数'language()'中的所有内容,只保留'return $ variable;'。之后,该网站的速度更快了。无论如何。我做了你的建议(在Google Chrome浏览器中查看检查员),我只能找到网络和资源,而不是你所说的。 – Erik
有一个常用的加入基于:https://developers.google.com/speed/pagespeed/ – Oliver
对不起,一个缓慢的激光。我在哪里可以找到这些日志?你给我的链接只允许我测试我的网站 - 不保存一些日志。你提到关于网络检查员的是什么?哪里可以找到测试SQL调用并保存日志? – Erik