Dwa połączenia ajax

Dwa połączenia ajax
AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

Witam,
mam skromną aplikację webową, która korzysta z techniki long polling. Problemem jest sytuacja, kiedy żądanie sprawdzające sobie czeka, a inne chce się połączyć. Te drugie kończy dopiero po pierwszym. Może na przykładzie:

Kopiuj
//plik odp.php
if($_GET['co']=='sprawdz')
{
	for($i=0; $i<10; $i++)
	{
		if(/*spradzanie, czy jest coś nowego*/) {/*...*/}
		else sleep(1);
	}
}
elseif($_GET['co']=='inna_czynnosc')
{
	print 0; //nawet jeśli to nic sensownego nie robi, to musi czekać
}

Sprawdzanie wykonuje się co 10s i zaraz po pustej pustej odpowiedzi znów jest wysyłane żądanie. Załóżmy, że nic nowego się nie dzieje.
Dla takiego wywołania w JS:

Kopiuj
$.postJSON("odp.php?co=inna_czynnosc", czynnosc_po_pobraniu);

wywołanie funkcji czynnosc_po_pobraniu nastąpi dopiero, kiedy zakończy się połączenie sprawdzania.
Czemu to musi czekać?
Próbowałem się łączyć z innym plikiem i wychodzi na to samo. Korzystam z jQuery. Bardzo proszę o jakąś radę.
Definicja postJSON:

Kopiuj
jQuery.postJSON = function(u,d,callback) {
 return jQuery.post(u, d, callback, "json");
}
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Jeżeli chcesz, aby po wywołaniu np.$.post kod szedł dalej, to musisz skorzystać z $.ajax z ustawieniem async: false. Dzięki temu możesz wywołać kilka zapytań na raz.
http://api.jquery.com/jQuery.ajax/


Demonical Monk
Przecież "post" sam jest asynchroniczny :|
AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

To nie może być to. Z resztą dokumentacja mówi: "By default, all requests are sent asynchronously". poza tym mam trzy żądania "inicjujące" i one są wykonywane równolegle...

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
0

pokaż cały skrypt (JS)


░█░█░█░█░█░█░█░█░█░█░█░
AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

Pełny kod zajmowałby niepotrzebnie miejsce, pominąłem analizę odpowiedzi, ale problem występuję także w dokładnie takiej funkcji jak poniżej:

Kopiuj
oDane.odswiez = function()
{
	$.postJSON("odp.php?co=wyslij_dane", function(odpowiedz) 
	{	
		if(odpowiedz!="0")
		{	
			//analiza odpowiedzi
			
		}	
		setTimeout(function() {oDane.odswiez()}, 500);
	});
		
}

Wszystkie inne wywołania do plików php są wstrzymywane:

Kopiuj
$.postJSON("odp.php")
$.postJSON("odp.php?cokolwiek")
$.postJSON("index.php")

Zaś wywołania do plików txt działają

Przecież sleep w php nie usypia całego serwera (interpretera php), nie?

Coś jest nie tak w innym miejscu. Na czystym pliku z pokazaną wyżej funkcją jest ok. Będę szukał jutro

edytowany 2x, ostatnio: appleman
RF
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 10 lat
1

Dlaczego skoro dane wysyłasz postem to szukasz ich w $_GET? //Nieważne, już widzę

Problem leży najpewniej po stronie php, musiałbyś pokazać cały kod strony (generalnie nie możesz sie odwoływać do zmiennej $_SESSION bo wtedy PHP zacznie kolejkować(?) requesty - chyba że w którymś zgłoszeniu (właściwie we wszystkih oprucz 1-go) zablokujesz sesje do zapisu wtedy requesty bedą sie wykonywały nizależnie).


da da da daaa
edytowany 1x, ostatnio: RFabianski
AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

Tak, problem tkwił w sesjach. Nie miałem pojęcia, że to blokuję. Po odczytaniu danych z sesji użyłem session_write_close i wszystko śmiga:) Wiedząc co wpisać do google znalazłem to:
http://forum.php.pl/lofiversion/index.php/t149339.html
Wielkie dzięki za pomoc, pewnie długo bym szukał, że to sesje wstrzymują ruch.

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.