Jak pokazać na stronie wynik wczytany z innych stron bez opóźnień?

Jak pokazać na stronie wynik wczytany z innych stron bez opóźnień?
dopelganger
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Cześć
Mój sklep pobiera dane z zewnętrznego systemu za pomocą CUrla. Problem polega na tym, że operacja trwa kilka sekund i spowalnia wczytywanie strony.
Działa to tak:
W pliku CSV mam listę sklepów gdzie można kupić dany produkt wraz z stanem magazynowym. Wchodząc na kartę danego produktu muszę wysłać w pętli endpoint dla każdego sklepu np: 100 (może ta lista rosnąć).

Kopiuj
/api/product/'.$id_produkt.'/magazyn/'.$id_sklepu_z_pliku_csv;

Oczywiście użyłem curl_multi_ ale trwa to i tak kilka sekund , około 5 na środowisku lokalnym. Być może ten czas na serwerze się skróci.

Jakie rozwiązanie można zastosować aby nie obciążało za bardzo strony i serwera, jednocześnie aby czas wczytania danych był jak najkrótszy ?

Rozwiązania o jakich myślę:

  1. Odpalać Curla dopiero po kliknięciu przycisku "Gdzie kupić? (Ajax) ". A więc strona z produktem wczyta się normalnie a popup z listą sklepów załaduje się dopiero gdy pobiorą się dane.
  2. Dane z zewnętrznego serwera zaczytywać w iframe (w popup) poprzez aplikację pośredniczącą. Wtedy nie będzie żadnego obciążenia, niezależnie czy 10 czy 100 użytkowników na stronie otworzy popup ?

Prośba o radę. Lub może inne rozwiązanie ?
Dzięki.

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 241
2

Do takich rzeczy robi się zadania w tle/kolejki nie wiem czy masz czystego PHP czy jakiś framework ale większość popularnych frameworków ma jakieś abstrakcje na kolejki, z tego skorzystaj.

dopelganger
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0
szok napisał(a):

Do takich rzeczy robi się zadania w tle/kolejki nie wiem czy masz czystego PHP czy jakiś framework ale większość popularnych frameworków ma jakieś abstrakcje na kolejki, z tego skorzystaj.

PHP i sklep jest na Magento 2

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10307
0
dopelganger napisał(a):

Jakie rozwiązanie można zastosować aby nie obciążało za bardzo strony i serwera,

To nie jest żadne obciążenie.

Po prostu wykonujesz blokującą operację, która długo trwa, więc nie jest dobrym user experience.

jednocześnie aby czas wczytania danych był jak najkrótszy ?

Nie skrócisz tego czasu - tak czy tak, zajmie to tyle samo. Jedyne co możesz zrobić, to poprawić user experience żeby "wydawało się" szybkie.

Rozwiązania o jakich myślę:

  1. Odpalać Curla dopiero po kliknięciu przycisku "Gdzie kupić? (Ajax) ". A więc strona z produktem wczyta się normalnie a popup z listą sklepów załaduje się dopiero gdy pobiorą się dane.
  2. Dane z zewnętrznego serwera zaczytywać w iframe (w popup) poprzez aplikację pośredniczącą. Wtedy nie będzie żadnego obciążenia, niezależnie czy 10 czy 100 użytkowników na stronie otworzy popup ?

<iframe/> odpada.

Ajax powinieneś dodać tak czy tak.

Dodatkowo powinieneś zapisać wynik tych endpointów na serverze na jakiś czas, tak żeby nie wczytywać ich wiele razy jeśli wynik się nie zmieni.

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1

Jak pokazać na stronie wynik wczytany z innych stron bez opóźnień?

Bez pana Einsteina nie poradzisz.
"Jakieś" opóznienie jest ZAWSZE, w tym wypadku za duże (Riddle)

Żeby prezentować z maksimum komfortu trzeba "oszukać", miec wypracowany wcześniej i cachowany. Ma to swoje trudności i zagadnienia też.

dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

Dwie sprawy:

Ajax

  • dane o których mówisz mają niską istotność, dla SEO tym bardziej (nie chcesz, żeby Ci google zaindeksowało dostępność produktów i nie odświeżało tego tygodniami), nic się nie stanie jeżeli będą ładować się dopiero z przeglądarki
  • w sumie przeglądarka i tak będzie ładować obrazki i inne bzdety, w międzyczasie może też lecieć ajax i dane pojawią się równo z innymi załadowanymi elementami tak czy siak

Cache

  • cache oczywiście wprowadza opóźnienia, ale np. do 2 minut opóźnienia przy szybkim ładowaniu zapewne jest lepsze niż "od razu", które zapycha serwery
  • oczywiście też jeżeli na stronie nie ma wielkiego ruchu (np. na jeden i ten sam produkt nie ma wizyt częściej niż co 30 minut) to cache nie będzie miał sensu - trzeba będzie go odświeżyć praktycznie za każdym razem i tak
  • no i do sedna - po zrobieniu tych 100+ requestów zapisz to sobie lokalnie w jednym miejscu
  • jeżeli od ostatniego odświeżenia nie minęła minuta - zwracaj dane z cache i tyle
  • jeżeli minęła minuta, a nie minęły dwie - zwracaj dane z cache i w międzyczasie odśwież dane w cache - żeby były dostępne dla kolejnego klientaasz serwery
  • jeżeli minęły te 2 minuty no to czekasz na świeży wynik (w tle aktualizujesz otrzymane dane w cache)
  • balans jest istotny - możliwe, że u Ciebie inne wartości niż 1 i 2 minuty się sprawdzą lepiej - to już wiesz sam najlepiej
  • istotna sprawa - źle zbudowany cache jest zbliżony do tego, jakby go nie było :) jeżeli cache jest pusty/nieaktualny i dwóch klientów wejdzie na stronę w odstępnie 200ms - to pasuje, żeby klient A spowodował wysłanie tych 100 requestów i odświeżenie cache, ale już klient B nie - klient B powinien poczekać na wyniki tego, co się dzieje w tle
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
1

Cześć, może warto byłoby stworzyć nowy atrybut dla produktów, tam wrzucać te dane, które chcesz wyświetlić i aktualizować o określony interwał jakimś skryptem, a na stronie produktu tylko wyświetlić zawartość tego atrybutu?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.