ajax long polling doba načítání v řádech desítek sekund
- James07
- Člen | 41
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
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
- greeny
- Člen | 405
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
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)