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

时间:2012-02-29 01:45:57

标签: php jquery autocomplete memcached

我在今天下午早些时候开始加速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" />

2 个答案:

答案 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的商品。