Ik ben bezig met een HTML pagina die van Ajax gebruik maakt. Op deze Ajax pagina zijn een hoop vakken. Elk vak staat voor een klant van ons, en een klant kan weer voor een aantal servers staan. Het systeem is bedoeld om van elke klant de huidige status te kunnen zien (alles goed, harde schijf die vol loopt..mailserver die plat ligt / enz..). Deze pagina staat de hele dag open op een plasma scherm dat hier aan de muur hangt.
Tot een paar weken geleden was dit een pagina die door PHP gegenereerd werd. Elke 10 seconde ging het scherm op wit en werd de boel ververst. Omdat dat heel irritant is, ben ik dus een tijd geleden aan de slag gegaan om hier een Ajax site van te maken. Dan hoeft de boel niet de hele tijd ververst te worden
Het probleem is dat na 20 tot 40 minuten het geheugengebruik onwijs toeneemt (van ~22MB tot 70MB, daarna loopt het op tot 500MB++). Duidelijk een geheugenlek dus. IE hoef ik niet eens te proberen want die begint direct het geheugen vol te gooien
Het is een hele lap code, ik zal functie een beetje proberen uit te leggen wat er gebeurd.
Er wordt een lijst met klanten van de server gedownload, en voor elke klant wordt er een div aangemaakt. Daarna wordt voor elke klant de huidige status ongevraagd, en aan de hand daarvan wordt er een bepaalde achtergrond afbeelding voor elke div ingesteld. Dit gaat allemaal goed. Het probleem zit hem in het updaten.
Bij het laden wordt het volgende ingesteld:
Het enige wat UpdateAction() doet, is UpdateKlanten() aanroepen.
Deze roep AjaxFunction aan. Deze functie voert het xmlHTTP request uit, en stuurt het resultaat weer door naar een andere functie:
Het resultaat, wat naar onderstaande functie (UpdateKlant() ) wordt doorgestuurd, ziet er zo uit:
Ik vermoed dat het iets te maken heeft met een timeout, dat er daardoor XMLHTTP objecten in het geheugen blijven hangen (oid) en dat daardoor het geheugen volloopt. Vergeet ik iets anders vrij te geven? Ik had ook al geprobeerd om iets met detach() te doen, maar ik kan nergens precies vinden wat het doet en hoe ik het moet gebruiken..
Of..is Ajax gewoon niet geschikt om constant open te laten staan? Iets wat ik zo langerzamerhand begin te vermoeden
Tot een paar weken geleden was dit een pagina die door PHP gegenereerd werd. Elke 10 seconde ging het scherm op wit en werd de boel ververst. Omdat dat heel irritant is, ben ik dus een tijd geleden aan de slag gegaan om hier een Ajax site van te maken. Dan hoeft de boel niet de hele tijd ververst te worden
Het probleem is dat na 20 tot 40 minuten het geheugengebruik onwijs toeneemt (van ~22MB tot 70MB, daarna loopt het op tot 500MB++). Duidelijk een geheugenlek dus. IE hoef ik niet eens te proberen want die begint direct het geheugen vol te gooien
Het is een hele lap code, ik zal functie een beetje proberen uit te leggen wat er gebeurd.
Er wordt een lijst met klanten van de server gedownload, en voor elke klant wordt er een div aangemaakt. Daarna wordt voor elke klant de huidige status ongevraagd, en aan de hand daarvan wordt er een bepaalde achtergrond afbeelding voor elke div ingesteld. Dit gaat allemaal goed. Het probleem zit hem in het updaten.
Bij het laden wordt het volgende ingesteld:
JavaScript:
1
| setInterval('UpdateAction();',5000); |
Het enige wat UpdateAction() doet, is UpdateKlanten() aanroepen.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| function UpdateKlanten() { laatstefunctie = "GET_KLANT"; for($i = 0;$i < KlantenLijst.length;$i++) { ajaxFunction(KlantenLijst[$i]); getIASOStatus(KlantenLijst[$i]); } if(update==0) { update = 1; } } |
Deze roep AjaxFunction aan. Deze functie voert het xmlHTTP request uit, en stuurt het resultaat weer door naar een andere functie:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| function ajaxFunction(klant) { TotalData = document.getElementById('gegevens'); TotalData.innterHTML = ontvangenTekens; var xmlHttp; try { // Firefox, Opera 8.0+, Safari xmlHttp=null; xmlHttp=new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp=null; xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { alert("Your browser does not support AJAX!"); return false; } } } xmlHttp.onreadystatechange=function() { if(xmlHttp.readyState==4) { if(laatstefunctie=="PullKlantenLijst") { ProccesKlantenlijst(xmlHttp.responseText); addData(xmlHttp.responseText.length); } else if(laatstefunctie=="GET_KLANT") { UpdateKlant(xmlHttp.responseText); addData(xmlHttp.responseText.length); } xmlHttp.onreadystatechange = new Function; } } if(klant==undefined) { xmlHttp.open("GET","AjaxRequest.php",true); xmlHttp.send(null); } else { klantEncode = escape(klant); xmlHttp.open("GET","AjaxRequest.php?klant=" + klantEncode,true); xmlHttp.send(null); } } |
Het resultaat, wat naar onderstaande functie (UpdateKlant() ) wordt doorgestuurd, ziet er zo uit:
code:
1
| Verhuisservice Jan van Otterlo=GOED |
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| function UpdateKlant(klant) { var TempKlant = new Array(); TempKlant = klant.split("="); if(TempKlant.length!=2) { //ReportBug("COM_ERROR:\r\n\r\n" + klant + "\r\n" + laatstefunctie); } else { if(LaatsteStatus[klant] == undefined) { LaatsteStatus[klant] = TempKlant[1]; } KlantDiv = document.getElementById(TempKlant[0]); if(LaatsteStatus[klant] == TempKlant[1]) { LaatsteStatus[klant] = TempKlant[1]; if(TempKlant[1] == "GOED") { KlantDiv.style.backgroundImage = "url(http://ks-hostmon/ajax/img/goed.png)"; KlantDiv.style.color = "RGB(255,255,255)"; } else if(TempKlant[1] == "INET_DOWN") { KlantDiv.style.backgroundImage = "url(http://ks-hostmon/ajax/img/inet_down.png)"; KlantDiv.style.color = "RGB(0,0,0)"; } else if(TempKlant[1] == "DISK_LOW") { KlantDiv.style.backgroundImage = "url(http://ks-hostmon/ajax/img/schijfruimte.png)"; KlantDiv.style.color = "RGB(0,0,0)"; } else if(TempKlant[1] == "UNKOWN") { KlantDiv.style.backgroundImage = "url('http://ks-hostmon/ajax/img/onbekend.PNG')"; KlantDiv.style.color = "RGB(0,0,0)"; } else if(TempKlant[1] == "FOUT") { KlantDiv.style.backgroundImage = "url('http://ks-hostmon/ajax/img/service.PNG')"; KlantDiv.style.color = "RGB(255,255,255)"; } else if(TempKlant[1] == "GPRS") { KlantDiv.style.backgroundImage = "url('http://ks-hostmon/ajax/img/gprs.PNG')"; KlantDiv.style.color = "RGB(0,0,0)"; } else if(TempKlant[1] == "WINTAX") { KlantDiv.style.backgroundImage = "url('http://ks-hostmon/ajax/img/wintax.png')"; KlantDiv.style.color = "RGB(0,0,0)"; } else { ReportBug("Onbekende status ontvangen => " + TempKlant[1]); } } } } |
Ik vermoed dat het iets te maken heeft met een timeout, dat er daardoor XMLHTTP objecten in het geheugen blijven hangen (oid) en dat daardoor het geheugen volloopt. Vergeet ik iets anders vrij te geven? Ik had ook al geprobeerd om iets met detach() te doen, maar ik kan nergens precies vinden wat het doet en hoe ik het moet gebruiken..
Of..is Ajax gewoon niet geschikt om constant open te laten staan? Iets wat ik zo langerzamerhand begin te vermoeden
PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc