在脚本的每个页面上都包含的配置文件中,我有以下代码来获取首选用户的语言文件:
if ($_SESSION['id']) { // if logged in
$language = mysql_result(mysql_query("SELECT default_lang FROM employees WHERE id = '$_SESSION[id]'"), 0);
include "languages/".$language.".php";
} else { // If not logged in, use system default language
$language = mysql_result(mysql_query("SELECT config_value FROM system_config WHERE config_name = 'language'"), 0);
include "languages/".$language.".php";
}
我的问题是,每次访问者刷新新页面时,此查询是否都会运行?查看给定页面上mysql查询总数的最简单方法是什么 - 我经常在论坛中看到这一点,即:在XX秒内执行20次查询。
答案 0 :(得分:1)
是的,每个时间都会运行一个 - 这有点愚蠢,因为你已经完成了一些每用户I / O来获得会话 - 你可以...... ..
$language=$_SESSION['lang'];
if (!$language) {
if ($_SESSION['id']) {
$language = mysql_result(mysql_query("SELECT default_lang FROM employees WHERE id = '$_SESSION[id]'"), 0);
} else {
$language = mysql_result(mysql_query("SELECT config_value FROM system_config WHERE config_name = 'language'"), 0);
}
$_SESSION['lang']=$language;
}
include "languages/".$language.".php";
甚至只需在请求中使用“Accept-Language”(假设您已使用标准命名并拥有所有语言)....
list($language)=explode(';', $_SERVER['Accept-Language']);
include "languages/".$language.".php";
(注意上面使用请求标头的代码需要稍微清理一下以避免本地文件包含漏洞)
答案 1 :(得分:0)
是的,两个查询中的一个将在每个页面加载时运行。
如果你不想这样做,你也可以将default_lang变量放在你的SESSION中。
答案 2 :(得分:0)
是的,每次重新加载页面时都会执行。但是,从技术上讲,第二次更快,因为它从缓存中获取或已经有查询计划。 请有人确认我是不是错了?
答案 3 :(得分:0)
一般来说,减少查询量是个好主意,但我宁愿尽早保持代码清洁。缓存会引入各种问题,除非你真的需要它,因为查询速度慢,否则浪费时间会增加代码的复杂性。
影响单个表并返回单个值的简单查询非常快。有可能,您尝试缓存该值不会带来显着的好处。
要了解性能,您应该开始使用分析器。它将向您展示脚本中需要花费时间的内容,它可能不是您所期望的。
对于开发环境,我喜欢使用KCacheGrind的XDebug。这是一个介绍教程:http://devzone.zend.com/article/2899