Rozpocząłem swoją podróż, aby przyspieszyć autouzupełnianie jQuery wcześniej tego popołudnia i zdecydowałem, że prawdopodobnie dobrym pomysłem jest rozpoczęcie memcachingu wszystkiego. Zgodnie z sugestią w tym artykule: Przyspieszenie autouzupełniania.

Jednak nadal mam do czynienia z powolnym czasem reakcji, nawet po zainstalowaniu i użyciu Memcached.

Problem w moim przypadku polega na tym, że mam do czynienia z wyjątkowo długimi listami, w moim przypadku ponad 6700 indywidualnych członków. (Wszystkie rodzaje lub rodzaje wszystkich roślin)

Wydaje się, że wąskie gardło polega na konstruowaniu tabeli i zapełnianiu listy po stronie klienta i nie jest spowodowane pobieraniem informacji z Memcached.

Jeśli ktoś inny napotkał ten konkretny problem, chciałbym usłyszeć o sprytnym sposobie jego rozwiązania. Zamieszczę mój kod poniżej.

Uwaga: ta konkretna strona jest niedostępna dla ogółu społeczeństwa i zdaję sobie sprawę, że istnieje kilka luk w zabezpieczeniach.


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" />
5
Ryan Ward 29 luty 2012, 05:45

2 odpowiedzi

Najlepsza odpowiedź
$(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
            });
        }
    });
});

Umieść adres URL do pliku PHP w generuje listę autouzupełniania w powyższym parametrze adresu URL zastępczego AJAX. W swoim kodzie PHP zmodyfikuj generowanie listy tak, aby zwracała tablicę wartości JSON, jak na przykład:

[ "first" , "second" , "anotherEntry" , "in" , "the" , "array" ]    

To zdecydowanie nie przyspieszy działania serwera przetwarzania, ale zabezpieczy Twoich użytkowników przed niektórymi opóźnieniami w stosowaniu listy autouzupełniania. W dużej mierze zakłada to, że użytkownik nie wykonuje natychmiast czynności, która wymaga autouzupełniania, nadal możesz załadować stronę i pozwolić użytkownikowi na wykonanie innych czynności. Ładowanie listy autouzupełniania powinno w większości wydawać się ciche i bezproblemowe.

Jest to świetne rozwiązanie w przypadku czasów ładowania krótszych niż kilka do kilku sekund, ale jeśli trwa to dłużej, użytkownicy mogą nadal mieć problemy z użytecznością.

Jeśli nadal występują opóźnienia po stronie serwera, rozważ użycie niektórych instrukcji czasowych, aby spróbować określić, gdzie jest wąskie gardło.

5
jmort253 29 luty 2012, 06:06

Ponieważ nie możesz niczego wyszukać, dopóki użytkownik nie wpisze co najmniej 1 znaku, możesz utworzyć 26 różnych list. Każda lista autouzupełniania zawiera tylko te elementy, które zaczynają się od tej litery. Twoje listy będą znacznie mniejsze i szybsze do załadowania.

Aby było jeszcze szybciej, utwórz więcej list. Prawdopodobnie potrzebujesz tylko pierwszych 30-40 pozycji do wyświetlenia. Jeśli pozycji nie ma na skróconej liście, użytkownik najprawdopodobniej wpisze kolejną literę. Następnie możesz podzielić swoje listy na 26*26 unikalnych list. Każda lista zawiera tylko pozycje, które zaczynają się od pierwszych 2 liter.

Możesz podzielić swoje przedmioty na tyle list, ile potrzebujesz. Robimy to na stronie, którą zarządzam, gdzie mamy ponad 500 000 pozycji dostępnych w naszym typie wyprzedzającym.

1
Brent Baisley 29 luty 2012, 06:43