我在今天下午早些时候开始加速jQuery的自动完成,并决定开始 memcaching 一切都是个好主意。正如本文所述:Speeding up autocomplete。
但是,即使在安装和使用 Memcached后,我仍然处理缓慢的响应时间。
我的问题是,在我的情况下,我处理的是非常长的列表,超过 6700 个人成员。 (所有植物的所有属或属)
瓶颈似乎是构建表并填充客户端列表,而不是从 Memcached 中检索信息引起的。
如果有其他人遇到这个特殊问题,我很想听到一个聪明的方法来解决它。我将在下面发布我的代码。
注意:此特定页面对普通公众不可用,我知道存在一些漏洞的安全漏洞。
require_once 'oo/Database.php';
$mysqldb = new Database;
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect to memcache");
$sql = "SELECT DISTINCT `Genus` FROM importlist.plants";
$key = md5('query'.$sql);
$result = $memcache->get($key);
//check if we got something back
if($result == null) {
//fetch from database
$result = $mysqldb->rawSelect($sql)->getResult();
//set to memcache, expires after 1 hour
$memcache->set($key,$result,0,3600);
}
//Result array
$Genera = ($memcache->get($key));
//Add required "quotation marks" for autocomplete
foreach ($Genera as &$Genus){
$Genus = '"'.$Genus[Genus].'"';
}
$Genera = implode($Genera,',');
//PHP to generate jQuery
echo <<< EOT
<script>
$(function() {
var availableTags = [$Genera];
$( "#tags" ).autocomplete({
source: availableTags
});
});
</script>
EOT;
?>
<input id="tags" />
答案 0 :(得分:5)
$(document).ready(function() {
// once page loads, make AJAX request to get your autocomplete list and apply to HTML
$.ajax({ url: '/path-to-get-tags-as-json.php',
type: "GET",
contentType: "application/json",
success: function(tags) {
$( "#tags" ).autocomplete({
source: tags
});
}
});
});
将URL放到PHP文件中,在上面的AJAX占位符url参数中生成自动完成列表。在PHP代码中,修改列表生成,以便它返回一个JSON数组,如下所示:
[ "first" , "second" , "anotherEntry" , "in" , "the" , "array" ]
肯定不会加快流程服务器端,但 将 保护您的用户免受应用自动完成时的一些延迟名单。这主要假设用户不会立即执行需要自动完成的操作,您仍然可以加载页面并允许用户执行其他操作。加载自动完成列表应该在很大程度上显示为无声且无缝。
这对于少于几秒到几秒的加载时间非常有用,但是如果它花费的时间超过了那么长,那么您的用户可能仍会遇到可用性问题。
如果仍有服务器端延迟,请考虑使用一些时序语句来尝试确定瓶颈所在。
答案 1 :(得分:1)
由于在用户键入至少1个字符之前无法查找任何内容,因此您可以创建26个不同的列表。每个自动完成列表仅包含以该字母开头的项目。您的列表将显着缩小并加载更快。
要使速度更快,请创建更多列表。您可能只需要显示前30-40个项目。如果该项目不在缩短列表中,则用户很可能会键入另一个字母。然后,您可以将列表划分为26 * 26个唯一列表。每个列表仅包含以前2个字母开头的项目。
您可以根据需要将项目分成多个列表。我们在我管理的网站上执行此操作,我们的预先输入中有超过500K的商品。