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" />
2 odpowiedzi
$(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.
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.
Podobne pytania
Powiązane pytania
Nowe pytania
php
PHP to szeroko stosowany, wysokopoziomowy, dynamiczny, zorientowany obiektowo i interpretowany język skryptowy przeznaczony głównie do tworzenia stron WWW po stronie serwera. Używane w przypadku pytań dotyczących języka PHP.