加快jQuery AutoComplete(不可避免的长列表)

我在今天下午早些时候开始了加速jQuery自动完成的过程,并认为开始记忆所有内容可能是一个好主意。 正如本文所述: 加速自动完成 。

但是,即使在安装和使用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  $(function() { var availableTags = [$Genera]; $( "#tags" ).autocomplete({ source: availableTags }); });  EOT; ?>  

 $(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个字符之前无法查找任何内容,因此可以创建26个不同的列表。 每个自动完成列表仅包含以该字母开头的项目。 您的列表将显着更小,加载速度更快。

为了使速度更快,请创建更多列表。 您可能只需要显示前30-40个项目。 如果该项目不在缩短列表中,则用户很可能会键入另一个字母。 然后,您可以将列表划分为26 * 26个唯一列表。 每个列表仅包含以前2个字母开头的项目。

您可以根据需要将项目分成多个列表。 我们在我管理的网站上执行此操作,我们的类型可以提供超过500K的商品。