![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 24.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Zastanawiam się w jaki sposób można rozwiązać następujący problem. Strona wyszukuje informacji w 10 niezależnych bazach danych o dużych rozmiarach (powiedzmy kilkadziesiąt tysięcy rekordów do przeszukania). Każda na osobnym serwerze. Zwrócenie wyniku każdej z nich trwa powiedzmy 3~5sek. Jak łatwo policzyć łącznie się z każdą bazą po kolei, wysłanie zapytania, odczytanie wyniku oraz wyświetlanie go na ekranie użytkownika zajmie 30~50 sek. W jaki sposób wysłać zapytanie do każdej z baz danych, tak żeby wszystkie serwery MySQL wykonywały swoją pracę jednocześnie, a nie po kolei? Najlepiej by było, gdyby wyniki były wyświetlane zgodnie z kolejnością ich nadchodzenia (czyli serwer który odpowie najszybciej wyświetlany na górze strony) Czy da się to zrobić z wykorzystaniem czystego PHP, czy trzeba "zaprząc" do pracy inne języki programowania? Pozdrawiam -willy- |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Do tego trzeba nawiązać asynchroniczne połączenia z bazami. A to wymusza zastosowanie AJAX i w tę stronę bym ciągnął, bo to wydaje mi się najbardziej sensowne z wszystkich możliwych podejść.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Do tego trzeba nawiązać asynchroniczne połączenia z bazami. A to wymusza zastosowanie AJAX i w tę stronę bym ciągnął, bo to wydaje mi się najbardziej sensowne z wszystkich możliwych podejść. Nie wymusza. Można przecież wywoływać skrypty potomne ze skryptu głównego (co nie znaczy, że tak będzie prościej czy lepiej (IMG:style_emoticons/default/winksmiley.jpg) ) I jest jeszcze coś takiego: http://www.php.net/manual/en/mysqli.reap-async-query.php szukam chętnego, który to rozgryzie (IMG:style_emoticons/default/winksmiley.jpg) [edit] Ha... czyli od wersji 5.3 PHP można wykonywać zapytania asynchroniczne przy pomocy mysqli_query z flagą MYSQLI_ASYNC Ten post edytował Mchl 15.12.2009, 08:46:39 |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Zauważ, że nawet w tej funkcji mysqli masz połączenie z jedną bazą, To, że wykonuje się asynchronicznie nie oznacza, że połączenia do kilku baz będą takie same. Musiałoby być jako mysql_link nie konkretna wartość, ale tablica, by działało na kilku możliwych i dodatkowo przy każdym zapytaniu musiałbyś ustawiać jaką bazę by obsługiwało w danym wypadku (IMG:style_emoticons/default/smile.gif) Oczywiście podanie tylko 1 bazy mogło by być wywoływaniem mysqli_query w sposób typowy, bez dodatkowego parametru (IMG:style_emoticons/default/smile.gif)
Możliwość z wywoływaniem skryptów potomnych jest, ale zauważ, że późniejsze "zsynchronizowanie wyników" przez nie zwróconych to mógłby być horror nie do przejścia dla większości. W AJAXie jest to jednak możliwe przy sensownie złożonej funkcji w Success bazującej na DOM (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Popełniłem taki test:
Wyniki [tt] ---------------------------- Zapytania po kolei Wynik 1. zapytania: 10032000 Wynik 2. zapytania: 10032000 Łączny czas: 7.5110111236572 ---------------------------- ---------------------------- Zapytania asynchroniczne Wynik 1. zapytania: 10032000 Wynik 2. zapytania: 10032000 Łączny czas: 3.6900150775909 ---------------------------- [/tt] Tak więc albo gdzieś popełniłem błąd metodologiczny, albo to całkiem dobra metoda. Chętnie sprawdziłbym więcej równoległych zapytań, ale mam u siebie tylko dwa rdzenie (IMG:style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 24.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za podpowiedzi.
Znalazłem przykład prezentujący dokładnie to o co mi chodzi. Jeśli możecie zerknąć na działanie strony www.findchips.com i podpowiedzieć mi w jak sposób zrealizowane jest wyszukiwanie w tym przypadku będę wdzięczny. Wyszukać można np "lm741" Pozdrawiam -willy- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Obstawiam, że okresowo ściągają dane od dystrybutorów i całe przeszukiwanie jest na ich własnym serwerze.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 24.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie wydaje mi się.
Raz, że powielanie baz danych nie ma sensu Dwa, każda z tych baz jest olbrzymia. Trzy, dane zmieniają się zbyt szybko. ... a przecież wystarczy, że dystrybutor udostępni adres bazy danych, nazwę użytkownika (tą samą którą dostaje użytkownik korzystający z wyszukiwarki na stronie) oraz hasło i sprecyzuje zapytanie zwracające wymagane dane zgodnie ze strukturą swojej bazy. Czy takie rozwiązanie nie ma sensu? -willy- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Nie jest to wykluczone. Możliwości jest wiele. Mogli się dogadać z dystrybutorami, że:
udostępnią do wyszukiwania API udostępnią dane do zalogowania się do bazy danych udostępnią logi binarne do replikacji Albo bardziej prozaicznie, mogą wykorzystywać curl do odpytywania wyszukiwarek na stronach dystrybutorów i wyświetlania tych danych u siebie. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 21:28 |