Avatar billede DGudiksen Nybegynder
18. januar 2010 - 12:53 Der er 18 kommentarer og
1 løsning

Optrimering af javascript.

Hej allesammen. Har fået lavet min en chat i php og javascript.
Har sat javascript til at opdatere 1 gang hvert sek så den hele tiden henter det nye data fra databasen.

Men syntes bare at det kræver en del af browseren, især hvis man nu har 2 javascripts igang.

Har hørt lidt om at ajax kan klarer det, men ajax skal vel også tjekke hver sekund efter nyt data, eller hvordan fungere det?.

Har i evt en måde som i vil anbefale at kører det på?.

Mvh.
Avatar billede majbom Novice
18. januar 2010 - 12:57 #1
hvordan opdaterer du nu? refresher hele siden?
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 12:59 #2
Altså jeg er ikke så meget inde i javascript og alt det der.

Så ved ikke om den opdatere hele siden, men den sætter hvertfald kun tekst ind i en af mine divs.
Avatar billede majbom Novice
18. januar 2010 - 13:21 #3
kan du poste noget kode - evt smid det ind på pastebin.com og læg linket her
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 13:24 #4

var count4 = 0;

var xmlhttp4;

function visbruger(who) {

    if (window.XMLHttpRequest) { // code for Mozilla, Safari, ** And Now IE 7 **, etc

        xmlhttp4=new XMLHttpRequest();

    } else if (window.ActiveXObject) { //IE

        xmlhttp4=new ActiveXObject('Microsoft.XMLHTTP');

    }

if (typeof(xmlhttp4)=='object') {

        var oDate4 = new Date();

        var url4  = "vis.php?d=" + oDate4.getTime() +"&test="+who;

        xmlhttp4.onreadystatechange=FileReady4;

        xmlhttp4.open('GET', url4, true);

        xmlhttp4.send(null);

   

    }

}

function FileReady4() {

    if (xmlhttp4.readyState==4) {

      if (xmlhttp4.status==200) {

            Opdaterbruger(xmlhttp4.responseText);

            count4++;

            if (count4 < 1) setTimeout("test()", 1000);

          }

        else {

            Opdaterbruger(xmlhttp4.statusText);

        }

      }

}



function Opdaterbruger(txt) {

  document.getElementById('test').innerHTML=txt;

}


Sådan ser det ud.
Avatar billede intenz Novice
18. januar 2010 - 14:01 #5
Det er ajax du har lavet. Så der er ikke så meget mere at hente der. Anden end du måske kan sætte det ned til hvert andet sekund eller lign.

Du bør måske fokusere på om din server-side database kald er optimeret. Hvis du kalder databasen hver gang der kommer et ajax kald til vis.php kommer du til at få problemer med databasen hvis der er mere end et par brugere online.
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 14:05 #6
itenz -> det er netop hvad jeg gør. Men hvordan skal jeg så lave det i php?
Avatar billede intenz Novice
18. januar 2010 - 14:08 #7
Det ser også ud til at du henter alle chatbeskeder af databasen (inden et tidsinterval) ud hver gang den opdaterer. Det ville være smartere hvis den kun hentede dem ud som brugeren ikke allerede har set og så bare tilføjede dem i chatten.

At hente det hele ud hver gang give både større datamængder der sendes over ajax og mere arbejde for serveren der skal bearbejde det.
Avatar billede intenz Novice
18. januar 2010 - 14:14 #8
#6
Det er lidt svært at svare på entydigt uden at se koden. Overordnet set bør du cache det data din vis.php fil returnerer.

Det kan normalt (afhængig af hvad dit webhotel understøtter) gøres i en tekst-fil med et timestamp på. Hvis andre brugere så skal bruge data fra samme tidspunkt, tjekker de først om denne fil eksisterer. Gør den det, kan de bare hente dataet ud af denne fil i stedet for at kalde databasen.

Jeg ved ikke hvor meget erfaring du har med php, men det kan godt blive lidt langhåret hvis du ikke har meget erfaring med det.
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 14:21 #9
Har en del erfaring med php. Forstår bare ikke helt måden du vil gøre det på ;-).

Hvis du evt gider prøve at forklarer mig lidt bedre hvad du mener?
så smider jeg 200points.

Mvh.
Avatar billede intenz Novice
18. januar 2010 - 14:47 #10
Nu har jeg ikke set din kode, så bliver bare et eksempel.
Du bør overveje hvor hurtigt du vil have dine chatbeskeder skal sendes ud til brugerne. Jo hurtigere, jo mere belastning kommer der på serveren og det kan blive mere besværligt at håndtere.

Så bør du også overveje hvor mange brugere der realitisk kommer til at bruge chatten samtidigt, hvis det er mindre 3-4 stykker gennemsnitligt, vil det nok være meget arbejde for så lidt.

Eksemplet viser hvordan vi finder et cache navn og hvordan vi tjekker om det mysql kald der skal laves allerede er gemt i cachen. Jeg har ikke testet det, så jeg ved ikke om det virker, men det burde kunne forklare princippet.

Du skal oprette en folder der med skriverettigheder, se første variabel i scriptet.

<?php
// sti til folder der skal holde cache elementerne
$cache_folder_path = "/www/cache";
$time_now = time();

// database kaldes igen hvert 5. sekund (skal være større end den tid der er mellem ajax kald)
$database_freq = 5;


$temp_calc = $time_now/$database_freq; // mellemregning

// få korrekt timestamp da sidst interval startede
$cache_timestamp = $time_now-((floor($temp_calc)-$temp_calc)*$database_freq);

// eksisterer cache fil allerede
if (file_exists($cache_folder_path."/".$cache_timestamp)) {

$data = file_get_contents($cache_folder_path."/".$cache_timestamp);
} else {
// kør database kald og bearbejdning af dataet
$data = "Her er vores færdigbehandlede data";

// gem det i cache til næste kald
$fp = fopen($cache_folder_path."/".$cache_timestamp, 'w+');
fwrite($fp, $data);
fclose($fp);
}

// udskriv data til ajax og afslut scriptet
print $data;
exit;
?>
Avatar billede intenz Novice
18. januar 2010 - 14:49 #11
Du bør så også lave et script der kan slette gamle cache filer, der f.eks. køres en gang i times gennem et cronjob
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 19:03 #12
Tak intenz - Jeg vil kigge på det idag og i morgen.

Er det okay at jeg vender tilbage til dig i en priv besked med hvordan jeg har fået det lavet, og med evt fejl og spørgsmål?

Lig et svar og få dine points.

Mvh.
Avatar billede intenz Novice
18. januar 2010 - 19:34 #13
Jeg svarer ikke på private beskeder herinde. Du kan stille et spørgsmål i PHP kategorien, så er der nok nogle der kan svare på det (måske mig, hvis jeg har tid).
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 19:52 #14
Okay bare i orden, ville også hører ad før jeg skrev. Men mange tak for hjælpen indtil videre.
Avatar billede intenz Novice
18. januar 2010 - 20:02 #15
Helt i orden :)
Avatar billede DGudiksen Nybegynder
18. januar 2010 - 22:04 #16
Hej igen intenz, ser lige om du stadig hænger på her.

Kom lige til at tænke lidt på at jeg jo også har en online liste.

Den kan jeg vel ikke lave på helt samme måde, da den jo også skal slette folk hvis de ikke er derinde længere?

Håber du forstår mig.

Mvh.
Avatar billede intenz Novice
18. januar 2010 - 23:02 #17
Det burde vel ikke være noget problem, da du også bare kan cache det indhold.
Så køre slette delen når cachen opdateres.
Avatar billede DGudiksen Nybegynder
19. januar 2010 - 09:28 #18
intenz, tak for svaret. Men så forstår jeg sq ikke helt hvad det cache der det gør?.
Avatar billede DGudiksen Nybegynder
19. januar 2010 - 09:29 #19
og jeg kan jo ikke slette en hvis jeg laver sådan at den kun skal hente den nyeste?. eller er jeg helt galt på den.

Mvh.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester