ajax long polling doba načítání v řádech desítek sekund

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
James07
Člen | 41
+
0
-

Dělám chat a po zapnutí long pollingu se mi začne jedna stránka načítat od 5 do 35sekund a stejně tak je i doba odezvy posílání zpráv, jenom ten long polling se zdá že je prováděn každou sekundu, jak je zamýšleno. Po vypnutí long pollingu jsou téměř okamžité odezvy po odeslání.
Ale pozn. Normálně trvá stránce na provedení cca 600 ms, není i toto nějak moc?

od klienta volám v javascriptu každou s tento blok kódu:

<script>
var jqxhr = $.ajax({
					method: 'POST',
					url: "/chat/www/chatrooms/update",
					cache: false,
					data: { room: id}
				})
</script>

A tady je metoda, která se volá:

<?php
	public function actionUpdate() {
		if (!$this->isAjax()) {
			$this->terminate();
		}
		$room = $this->request->getPost('room');
		// neprislo id mistnosti
		if (empty($room)) {
			$this->terminate();
		}
		// ziskam activeRow s podrobnostmi, (chatroom_id, user_id, last_message, entered)
		$in_room = $this->context->getService('roomsService')->inRoom($this->getUser()->getId(), $room);
		if (is_null($in_room)) {
			// nema tu co delat, neni clenem teto mistnosti
			$this->terminate();
		}

		// ziskej nove zpravy od posledni kontrolyn ovych zprav
		$messages = $this->context->getService('messagesService')->getNewMessages($room, $in_room->last_message);
		// aktualizuj posledni precteni zprav
		$this->context->getService('roomsService')->updateLastMsg($this->getUser()->getId(), $room);
		$returnMessages = array();
		// fetchni zpravy do jednoho pole
		foreach ($messages as $msg) {
			array_push($returnMessages, array(
				'id'	=> $msg->id,
				'from'	=> $msg->ref('from_user_id')->name,
				'time'	=> $msg->time,
				'msg'	=> $msg->message
			));
		}
		// zadna nova zprava, konec
		if (empty($returnMessages)) {
			$this->terminate();
		}
		// odesli nove zpravy
		$this->sendResponse(new \Nette\Application\Responses\JsonResponse($returnMessages));
		$this->terminate();
	}
?>

Už jsem se i díval na snippety pro ajax, ale skoro už mám aplikaci, jenom ta příšerná doba odezvy je k nevydržení. Není nějaké nastavení nebo volba, která ji odstraní? Případně co dělám špatně?

Editoval James07 (24. 3. 2015 16:41)

David Matějka
Moderator | 6445
+
0
-

Jestli mas otevreno vice tabu, ktery provadeji ten long polling, tak to mozna zpusobuje lock na session – se session muze totiz pracovat soucasne pouze jeden pozadavek toho uzivatele, takze se ceka na uvolneni zamku.

Normálně trvá stránce na provedení cca 600 ms, není i toto nějak moc?

v production mode nebo v debug? v production by to bylo hodne… kdyztak zkus aplikaci profilovat – treba pres xdebug nebo blackfire

James07
Člen | 41
+
0
-

Mám otevřené celkem 2 účty, jeden v Chrome, 2. ve firefoxu. Průměrně, než se zobrazí jedna zpráva na druhé straně, to trvá 40s, a než se vůbec zaregistruje odeslaná zpráva ->30 sekund.

Používám obě vývojářské verze

greeny
Člen | 405
+
0
-

Zkus použít WebSockety místo ajaxu, na chat se hodí mnohem víc. Dá se na to napsat i php server.

James07
Člen | 41
+
0
-

Bohužel je to školní projekt a máme pevně dáno použít AJAJ, jinak bych na to použil asi socket.io.

Asi jsem zjistil, kde je zakopaný pes. Když se provádí pouze update, tak celý požadavek trvá 1,64s, ale když mezitím pošlu za 1s 3 zprávy, tak se ten čas na provedení 1 update zvýší i na třeba 15s a sníží se, až zase přestanou létat zprávy.

Takže paradoxně zvýšením intervalu volání obnovení získám odezvu rychleji.

Editoval James07 (24. 3. 2015 20:11)