• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapytania $.ajax blokuje cały serwer

VPS Starter Arubacloud
0 głosów
694 wizyt
pytanie zadane 16 czerwca 2018 w PHP przez kevin Mądrala (5,010 p.)
Witam!

Posiadam pewien problem z zapytaniami AXAX'owymi, nie jestem pewny czy ten mechanizm z jQuery $ajax() nie działa tak że wykonuje się jedno zapytanie i aby wykonać drugie te poprzednie musi dostać odpowiedź ( mu zostać zakończone ). Mam takie jedno zapytanie które wykonuje akcje na serwerze tylko ta akcja uruchamia pewien import i trwa jakieś 30minut. W tym czasie kiedy uruchomię tą akcję chcę mieć podgląd statusu tego importu więc co 10 sekund wykonuję drugie zapytanie które zwraca z bazy ilość dodanych rekordów przez import (zwykłą liczbę). Problem polega na tym że podczas trwania tego importu zapytanie ajaxowe nie może dostać odpowiedzi od serwera do czasu aż import się nie skończy. Dodam jeszcze że zapytanie które uruchamia import blokuje cały serwer tzn nie mogę odświeżyć strony na drugiej karcie dotąd aż import się nie zakończy.

Używam Symfony 4.1 i serwera php bin/console server:run , Import uruchamiam funkcją $.ajax() podając routing do kontrolera który uruchamia import.

Czy takie zachowanie że po zapytaniu które trwa 30minut zostaje zblokowana cała strona jak to wyżej napisałem jest normalne ?
komentarz 16 czerwca 2018 przez rafal.budzis Szeryf (85,340 p.)
Nie jest to normalne jeśli w jQuery w funkcji ajax nie przekazałeś async na false. Pokaz skrypt JSa prawdopodobnie tam jest błąd.

PS. możesz użyć SSE zamiast ajax i zrobić to za pomocą jednego zapytania ;)

3 odpowiedzi

+2 głosów
odpowiedź 16 czerwca 2018 przez adrian17 Ekspert (349,240 p.)
A może inaczej, u źródła - zamiast robić 30-minutowe zapytania, zmień zapytanie aby tylko uruchomiło pracę na serwerze i od razu zwróciło status. Zamiast czekać 30 minut na zakończenie zapytania, odpytuj się co jakiś czas, czy zadanie zostało zakończone.

To wydaje się też bardziej odporne na sytuacje typu krótkotrwałe rozłączenie sieciowe lub timeouty po którejkolwiek stronie.
0 głosów
odpowiedź 16 czerwca 2018 przez Ehlert Ekspert (213,860 p.)

Odpalanie serwera aplikacji przez server:start wykorzystuje nic innego jak wbudowany w cli php serwer do devu. Jest on w stanie obsłużyć tylko jeden request na raz. Jeśli potrzebujesz czegoś więcej, to łap za Nginxa.

–1 głos
odpowiedź 16 czerwca 2018 przez BT101 Stary wyjadacz (12,540 p.)

Czy takie zachowanie że po zapytaniu które trwa 30minut zostaje zblokowana cała strona jak to wyżej napisałem jest normalne ?

Nie wiem co to dokładnie robi ale zapytanie, które trwa tak długo nie powinno mieć miejsca. Czy to zapytanie trwa 30 min w sensie response pojawia sie po 30 minutach? Użyj webSocket.

Same zapytania w sobie są asynchroniczne więc chyba jedno nie powinno mieć wpływu na drugie ale być może twój backend jest "zajęty".

komentarz 16 czerwca 2018 przez kevin Mądrala (5,010 p.)
Zapytanie uruchamia ten import. Tak czeka na ten response bo on pojawia się po tych 30 minutach przez ten czas kontroler mieli ten import.
komentarz 16 czerwca 2018 przez BT101 Stary wyjadacz (12,540 p.)
W takiej sytuacji wydaje mi się, że powinieneś użyć webSocket żeby otworzyć stream między backendem a frontem
komentarz 16 czerwca 2018 przez rafal.budzis Szeryf (85,340 p.)
Komunikacja jest jedno stronna wiec można się pokusić o SSE zamiast WS które w przeciwieństwie do WS da się stworzyć w PHP.
komentarz 16 czerwca 2018 przez Tomek Sochacki Ekspert (227,490 p.)
@rafal612b a coś takiego: http://socketo.me/ ? Nie pracuję na codzień w PHP więc nie twierdzę, że to na pewno dobrze działa, tak dopytuję bardziej z ciekawości bo to pierwszy link w google na hasło websocket in php.
komentarz 16 czerwca 2018 przez kevin Mądrala (5,010 p.)
Ale ogólnie to gdzie leży problem ? Gdzie mam szukać rozwiązania bo zostaje zblokowane wszystko, nie mogę nawet uruchomić innej podstrony
komentarz 16 czerwca 2018 przez rafal.budzis Szeryf (85,340 p.)

@Tomek Sochacki PHP nie jest językiem do zadań asynchronicznych nawet jeśli się da wiąże się to z nagięciem wszelkich sensownych schematów programowania w PHP. Język po prostu nie został do tego stworzony. W SSE PHP pracuje tak jak został stworzony z góry  do dołu wystarczy się pobawić z funkcjami ob_* do przechwytywania i wysyłania bufora.

Przykładzik SSE w PHP ma nie całe 30 linijek ;) 
https://blog.piotrnalepa.pl/2015/06/11/jsphp-jak-zaimplementowac-powiadomienia-typu-push-w-aplikacji-javascript/

@kevin Nie jesteśmy w stanie ci pomóc bez możliwości zobaczenia kodu (chociaż samego JSa)

komentarz 16 czerwca 2018 przez Tomek Sochacki Ekspert (227,490 p.)
@rafal612b tak wiem, kiedyś pracowałem trochę z PHP, tak pytałem bardziej z ciekawości bo w sumie moja przygoda z PHP się skończyła gdy do akcji pomału wkraczała wersja 7 więc trochę nie jestem pewnie już na czasie :)

W sumie zawsze można odpalić drugi serwerek np. w node gdzie praca z WS jest bardzo prosta.
komentarz 16 czerwca 2018 przez rafal.budzis Szeryf (85,340 p.)

@Tomek Sochacki Racja można i byłby to lepszy sposób na WebSocket lecz SSE daje możliwości dokładniejszego raportowania wykonywanego własnie procesu ;) (Połączenie SSE wykonywało by import)  Gdyby robić taki import w poprawny sposób dla uniknięcia ciągłego przeliczania indeksów w MySQLu wszystko bym zamknął w wielką transakcje wówczas nie dobijesz się zadnym innym połączeniem do jakichkolwiek danych / statystyk.  

No i mimo tego ze node byłby asynchroniczny to i tak odpytywał by się MySQLa w określonych odstępach czasu więc wyszło by na to samo tyle ze robilibyśmy to po stronie serwera :)

1
komentarz 16 czerwca 2018 przez Comandeer Guru (604,780 p.)

PHP nie jest językiem do zadań asynchronicznych nawet jeśli się da wiąże się to z nagięciem wszelkich sensownych schematów programowania w PHP.

Czy ja wiem? Widziałem już benchmarki, w których implementacje web socketów w PHP miażdżyły implementacje w node.js. No i po implementacji event loopa (jak to robi np. React.php) wygląda to sensownie.

komentarz 17 czerwca 2018 przez BT101 Stary wyjadacz (12,540 p.)

A ten -1 za co? Jak potwierdził @Ehlert trafnie zdiagnozowałem, że serwer nie jest w stanie obsługiwać kolejnych requestów ponieważ jest "zajęty" i zaproponowałem użycie webSocket, które da się stworzyć a @Comandeer uznał za niegłupie rozwiązanie.

Podobne pytania

0 głosów
0 odpowiedzi 291 wizyt
0 głosów
0 odpowiedzi 319 wizyt
pytanie zadane 19 czerwca 2018 w Sieci komputerowe, internet przez kubekszklany Gaduła (3,230 p.)
0 głosów
2 odpowiedzi 202 wizyt
pytanie zadane 7 września 2022 w PHP przez Filipczak Gaduła (4,020 p.)

92,958 zapytań

141,920 odpowiedzi

321,149 komentarzy

62,291 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...