Avatar billede Rakkey Nybegynder
02. juni 2013 - 16:09 Der er 6 kommentarer og
1 løsning

Responstid udregner i php 200 point ude

Halløj alle sammen :)

Jeg er igang med et support system til eget forbrug, men er løbet ind i et par problemer som jeg håber i kan hjælpe med. Jeg står nemlig og skal udregne response tid for hver besvarelse, hvilket er lidt halv kompliceret efter min mening.

Formålet: er at kunne fortælle kunden hvor lang repsonse tid de oplever lige pt. Derfor skal udregneren kører via et cron job, som derfor opdatere tiden (kører scriptet).

Tabeller: for at simplificerer det bare en smule, har jeg valgt at oprette en tabel i mysql med udelukket dette formål. Tabellen er struktureret på følgende måde:

id      hdid    adminid userid  dato

1    5879    0    55    1370179197
2    5879    1    0    1370179266
3    5879    0    55    1370180430
4    5879    0    55    1370180433
5    5879    1    0    1370180438
6    6450    0    99    1370180439

Fortegnelse: hvis adminid er forskellig fra 0 er det en supporter som har lavet en besvarelse, ligeledes hvis userid er forskellig fra 0 er den en kunde som har lavet besvarelsen. Det skal noteres at adminid og userid ikke kan være forskellig fra 0 på samme tid.
Hdid er support sagens unikke nummer, som viser at besvarelserne kommer fra hvilken support sag.
NB. Dato er skrevet i timestamp.

Systemet skal gøre følgende:

Step 1: Systemet begynder med at finde den første post, her notere vi hdid´et (5879) så vi kan søge efter andre besvarelser i den samme support sag. Ligeledes noteres datoen (1370179197). Vi bemærker ligeledes at det er kunden som har skrevet ind, og derfor er userid = 55 og adminid = 0

Step 2: Derefter skal systemet finde den næste post med samme hdid (5879) her finder systemet besvarelsen med id 2 hvor vi kan se det er en supporter der har besvaret kunden (da adminid = 1). Vi notere datoen (1370179266) og udregner differencen mellem de 2 datoer vi har fundet.

Derefter skal systemet gå videre til den næste som er post 3 (id 3), som er kunden der skriver tilbage, her gør den det samme som i step 1, og ligeledes finder den, den næste på samme måde som i step 2.


Til sidst skal den tage alle responstidernerne og ligge dem sammen, og dividere med antallet af tal, således at vi får gennemsnitet.

Jeg ved godt det er meget kompliceret, men jeg smider 200 points, til den person som kan skrive et script, som kan løse problemstillingen.
02. juni 2013 - 22:52 #1
Hvis du skal bruge et skript der løser din problemstilling, så skal du nok over i kategorien Jobs/opgaver, og så skal du nok regne med at betale med noget andet end points.  Men hvis det drejer sig om hjælp til selvhjælp, så har jeg nogle spørgsmål for at forstå problemstillingen. 

Kan det forekomme, at der i en support sag, en hdid, kan forekomme spørgsmål fra flere forskellige brugere?  Såsom

5879  0  55  1370179197
5879  0  62  1370179298

Hvis der kun kan være en bruger i en support sag, så kan problemstillingen vel udtrykkes i, indenfor de enkelte support sager, at trække timestamps hvor adminid = 0 fra timestamps hvor adminid = 1.  Hvis der for hvert spørgsmål var et svar, altså lige mange af hvert, så kunne man, indenfor hver support sag, tage summen af timestamps med adminid = 1 minus summen af timestamps med adminid = 0. 

Men der synes ikke at være lige mange spørgsmål og svar.  Så hvorledes beregnes responsetiden på et spørgsmål?  Du fortæller, at id2 er svar på id1, så responsetiden er 69 (1370179266 - 1370179197).  Men hvilke id'er er svar på id3 og id4?  Er id5 svar på både id3 (responsetid 8) og id4 (responsetid 5)?  Hvis scriptet skal køre flere gange på bestemte tidspunkter, så vil der forekomme spørgsmål der endnu ikke er svaret på.  Såsom id6.  Hvordan beregnes responsetiden for sådanne rækker?

Skal scriptet køres for en bestemt support sag ad gangen?  Såsom at kunde 55 kan få responsetid for hdid 5879.  Eller skal der beregnes gennemsnitlig responsetid for hver af de bestående support sager?  i så falt, skal der også beregnes response tid for support sager der allerede er afsluttede, eller kun åbne support sager?  Hvis kun åbne support sager, hvordan vides der så hvilke support sager der er åbne?  Eller er det således, at der hver gang scripted køres kun skal tages spørgsmål/svar med der er yngre end forige gang scripted blev kørt?
Avatar billede Rakkey Nybegynder
03. juni 2013 - 17:53 #2
Der er ikke flere som kan besvare i samme support sag, kun 1 kunde pr. support sag.

Ligeledes skal scriptet køre hele tiden, og de sager som ikke er besvaret endnu, har jo bare en svartid på oprettelsetiden - tiden vi har nu.

Og det skal være for alle supportsager som gennemsnit.
Generelt skal scriptet tage udgangspunk i alle besvarelser fra al den tid som der er blevet skrevet igennem.

Mine tanker går på at lave et array hvor man gemmer datoerne i 2 talrækker, men problemet ville være at man skal minus de rigtige tider med hinanden hvilket jeg ikke kan se hvordan jeg skulle gøre.
03. juni 2013 - 20:23 #3
At finde ud af hvordan man får de rigtige tider minusset fra hinanden må vist starte med at definere hvilke tider der skal minusses fra hinanden.  Det at 'tage udgangspunk i alle besvarelser fra al den tid som der er blevet skrevet igennem' forstår jeg ikke.  Du fik ikke svaret konkret på (eller jeg forstod ikke dit svar) hvordan præcist respons tiden beregnes for hver af værdierne i den tabel du viser.  Jeg går ud fra, men bekræft eller ret mig, at respons tiden for id 1 beregnes ved at trække tiden fra id 2's tid.  Men hvordan beregnes respons tiden for id 3 og id 4?

Med hensyn til id 6:  Det er vel næppe rigtigt, at scriptet skal køre bogstaveligt talt hele tiden.  Det må vel være således, at scriptet skal starte med meget korte mellemrum, måske endda således, at et nyt gennemløb af scripted skal starte, så snart det gamle gennemløb er komplet.  Men hvert gennemløb af scriptet må starte på et bestemt tidspunkt.  Er det således, at i hvert gennemløb af scriptet beregnes response tiden for ubesvarede spørgsmål ved at trække spørgsmålets tid fra starttidspunktet for gennemløbet?

Så tillader jeg mig også at tvivle på, at bogstaveligt talt alle support sager skal have responsetiden beregnet 'hele tiden.'  Også de supportsager der er en måned eller tre år gamle og hvor der hverken har været nye spørgsmål eller nye svar i meget lang tid?  Der skal vist en kraftig computer til at gøre det.  Det må være således, at der skal beregnes response tider for de 'aktuelle' eller 'åbne' support sager, og du må have en måde at definere, eller markere, åbne support sager.

Kom tilbage og præciser problemstillingen.  Hverken du eller jeg kommer videre før vi har det på det rene.
Avatar billede Rakkey Nybegynder
03. juni 2013 - 21:50 #4
For at beregne svar tid på support sagen: 5879 gøres følgende.
(((id1-id2)+(id3-5)))/2)

grunden til jeg vælger at springe id4 over, er at der ikke har været en besvarelse fra en support imellem og derfor er tiden fra id3 til id5 istedet.

id      hdid    adminid userid  dato

1    5879    0    55    1370179197
2    5879    1    0    1370179266
3    5879    0    55    1370180430
4    5879    0    55    1370180433
5    5879    1    0    1370180438
6    6450    0    99    1370180439



Scriptet skal ikke kører hele tiden, men i et cornjob med f.eks. 5-10 min interval.
Ligeledes definere vi nu antallet af sager således at den kun skal tage gennemsnitet af de sidste 100 sager.
04. juni 2013 - 01:12 #5
De sidste 100 sager, er det sagerne med de 100 højeste numre?  Jeg antager i det følgende, at det er således.  Og så går jeg ud fra, at rækkerne (spørgsmål og svar) indenfor en hdid altid står i tidsrækkefølge.  Det vil ikke kunne forekomme for eksempel følgende:

id hdid adminid userid dato
32 5879 0 55 1370179197
33 5879 0 55 1370179196

Og så ser det ud fra, at du definerer response time således:

For hver hdid, gå tabellen igennem i id rækkefølge.  Find den første række med adminid = 0 og noter tiden.  Find så den først følgende række med adminid = 1 og noter tiden.  Træk den første tid fra den anden tid.  Gå videre og find den først følgende række med adminid = 0 og træk tiden fra den næst følgende række med adminid=1.  Gå videre, indtil der ikke er flere id'er for hdid'en.  Hvis den sidst fundne række har adminid=0 trækkes tiden fra tiden da scriptet blev startet.

Hvis man kan forestille sig, at det laveste id i en hdid har adminid=1, så bliver den id ikke regnet med.  Hvis der er flere id'er i rækkefølge med adminid=0, så bliver kun den første regnet med, og hvis der er flere id'er i rækkefølge med adminid=1 bliver også kun den første regnet med.  For eksempel:

id hdid adminid userid dato
32 5879 1  0 1370179101
33 5879 0 55 1370179102
34 5879 0 55 1370179103
35 5879 1    0 1370179104
36 5879 0 55 1370179105
37 5879 1  0 1370179106
38 5879 1  0 1370179107
39 5879 0 55 1370179108

så beregnes gennemsnits responstiden som

(35-33)+(37-36)+(script starttid-39)/3

Er det korrekt forstået?

Hvis det er korrekt, så kunne fremgangsmåden være denne, i pseudokode:

1.  Du placerer tiden hvor scriptet startes i en variabel $starttid.

2.  Så finder du de 100 hdid'er med de højeste numre (SELECT DISTINCT hdid FROM mytable ORDER BY hdid DESC LIMIT 100) og placerer hdid'erne i en array.

3.  For hver hdid i denne array gør du følgende:

a.  Du selecter adminid og dato for alle rækker i tabellen med dette hdid, order by id, og placerer resultatet i en todimensionel array.  Derefter laver du endnu et element i arrayen med adminid = 1 og tiden = $starttid.

b.  Du kan så lave en $tæller=0, $tidlav = 0,og  $tidhøj= 0.

c.  Så går du gennem rækkerne i den todimensionelle array.

c.1.  Hvis i den første række admin = 1 (således at den første række er et svar) så skipper du rækken.  Hvis admin = 0 lægger du tiden til $tidlav, og forøger $tæller med 1.

c.2.  Nu skal du bruge et svar.  Hvis i den næste række i arrayen admin = 0, så skipper du rækken.  Hvis admin = 1 lægger du tiden  til $tidhøj og forøger tælleren med 1.

Så gør du c.1 igen, skipper den næste række i arrayen hvis adminid = 1 og ellers forøger $tidlav med tiden og $tæller med 1.

Og så gør du c.2 igen, skipper den næste række i arrayen hvis adminid = 0 og ellers forøger $tidhøj med tiden og $tæller med 1.

d.  Når der ikke er flere rækker i arrayen trækker du $tidlav fra $tidhøj og dividerer resultatet med $tæller, og du har gennemsnits responsetid for hdid'en.

Og derefter forfra med 3. med den følgende hdid.
Avatar billede Rakkey Nybegynder
04. juni 2013 - 02:48 #6
så beregnes gennemsnits responstiden som
(35-33)+(37-36)+(script starttid-39)/3

Korrekt.

Hold da op en løsning, jeg tror jeg vil prøve at finde mig en som kan konstruere et eksempel, det virker lidt for hardcore til mig.
Men du skal have mange gange tak, smid et svar så får du pointsne.
04. juni 2013 - 07:12 #7
Svar fra mig.
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