Avatar billede neander Nybegynder
23. juli 2004 - 22:10 Der er 27 kommentarer og
1 løsning

Optimering af linkchecker

Jeg har klippet noget kode sammen som checker om de links jeg har i en database fungerer. Men Det tager vildt lang tid for serveren at gennemgå dem alle. Hvordan kan man optimere det her script?



<%
Server.ScriptTimeout = 500

Set rs = Server.CreateObject("ADODB.Recordset")
Query = "SELECT * FROM Links ORDER by Title desc;"
rs.Open Query, Connect, 1, 2
title = rs("Title")
id = rs("id")
url = rs("url")


' Array med URL'er, som skal chekkes
arrURLS = "http://www.exp.dk"
do until rs.EOF
  arrURLS = arrURLS & ",url"
loop
movenext

arrURLS = Split(arrURLS,",")

' Array med HTTP headerkoder
arrHTTPcode = Array("100", "101", "200", "201", "202", "203", "204", "205", "206", "300", "301", "302", "303", "304", "305", "307", "400", "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "500", "501", "502", "503", "504", "505")
' Array med HTTP header kodernesforklaringer
arrHTTPtext = Array("Continue", "Switching Protocols", "OK", "Created", "Accepted", "Non-Authoritative Information", "No Content", "Reset Content", "Partial Content", "Multiple Choices", "Moved Permanently", "Found", "See Other", "Not Modified", "Use Proxy", "Temporary Redirect", "Bad Request", "Unauthorized", "Payment Required", "Forbidden", "Not Found", "Method Not Allowed", "Not Acceptable", "Proxy Authentication Required", "Request Time-out", "Conflict", "Gone", "Length Required", "Precondition Failed", "Request Entity Too Large", "Request-URI Too Large", "Unsupported Media Type", "Requested range not satisfiable", "Expectation Failed", "Internal Server Error", "Not Implemented", "Bad Gateway", "Service Unavailable", "Gateway Time-out", "HTTP Version not supported")
' Gennemløb Array med URL'er
For intURL = 0 to Ubound(arrURLS)
  Set HttpObj = Server.CreateObject("AspHTTP.Conn")
  HTTPObj.Url = arrURLS(intURL)
  HTTPObj.GetURL

  For intCode = 0 to Ubound(arrHTTPcode)
    If Instr(HttpObj.Response,arrHTTPcode(intCode)) Then
      strResponse = arrHTTPtext(intCode)
      Exit For
    End if
  Next
  Response.Write "<p>" & arrURLS(intURL) & " - " & strResponse & "</p>"
  strResponse = ""
Next
%>
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:16 #1
Dit gennemløb af databasen ser helt forkert ud - er det meningen?
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:18 #2
Set rs = Server.CreateObject("ADODB.Recordset")
Query = "SELECT * FROM Links ORDER by Title desc;"
rs.Open Query, Connect, 1, 2
arrURLS = "http://www.exp.dk"
do until rs.EOF
  url = rs("url")
  arrURLS = arrURLS & "," & url
  movenext
loop
Avatar billede neander Nybegynder
23. juli 2004 - 22:18 #3
hmm... jeg prøvede bare med at flette en loop ind i et andet script til aspHTTP, så det er da ikke meningen det er forkert... hvor går det galt?
Avatar billede neander Nybegynder
23. juli 2004 - 22:18 #4
ok, 2 sek kigger
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:19 #5
Det kan jo tage ret lang tid, når du ikke siger movenext inde i din loop. Og så skal den også være

  rs.movenext

Det fik jeg ikke rettet
Avatar billede neander Nybegynder
23. juli 2004 - 22:27 #6
Det går utrolig langsomt... jeg har omkring 300 links der skal checkes. Er der ikke mulighed for at den tager en ad gangen og spytter resultatet ind i en tabel en efter en?
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:30 #7
Ja, det tager tid. Det kræver typisk et DNS opslag, en oprettelse af en HTTP-forbindelse, hentning af data.
Jeg ville køre et lille program/script på min PC i stedet for.
Avatar billede neander Nybegynder
23. juli 2004 - 22:34 #8
Men kunne man ha mulighed for at følge med i alle de links der checkes løbende, så ville det jo ikke føles som så dræbende lang tid. Kan man lave en slags oplistning i en tabel løbende tror du?
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:36 #9
Prøv en
  response.flush

efter hvert check
Avatar billede neander Nybegynder
23. juli 2004 - 22:40 #10
Det giver ingen forskel...



' Array med URL'er, som skal chekkes
arrURLS = "http://www.exp.dk"
do until rs.EOF
  url = rs("url")
  arrURLS = arrURLS & "," & url

loop
rs.movenext
arrURLS = Split(arrURLS,",")

' Array med HTTP headerkoder
arrHTTPcode = Array("100", "101", "200", "201", "202", "203", "204", "205", "206", "300", "301", "302", "303", "304", "305", "307", "400", "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "500", "501", "502", "503", "504", "505")
' Array med HTTP header kodernesforklaringer
arrHTTPtext = Array("Continue", "Switching Protocols", "OK", "Created", "Accepted", "Non-Authoritative Information", "No Content", "Reset Content", "Partial Content", "Multiple Choices", "Moved Permanently", "Found", "See Other", "Not Modified", "Use Proxy", "Temporary Redirect", "Bad Request", "Unauthorized", "Payment Required", "Forbidden", "Not Found", "Method Not Allowed", "Not Acceptable", "Proxy Authentication Required", "Request Time-out", "Conflict", "Gone", "Length Required", "Precondition Failed", "Request Entity Too Large", "Request-URI Too Large", "Unsupported Media Type", "Requested range not satisfiable", "Expectation Failed", "Internal Server Error", "Not Implemented", "Bad Gateway", "Service Unavailable", "Gateway Time-out", "HTTP Version not supported")
' Gennemløb Array med URL'er
For intURL = 0 to Ubound(arrURLS)
  Set HttpObj = Server.CreateObject("AspHTTP.Conn")
  HTTPObj.Url = arrURLS(intURL)
  HTTPObj.GetURL

  For intCode = 0 to Ubound(arrHTTPcode)
    If Instr(HttpObj.Response,arrHTTPcode(intCode)) Then
      strResponse = arrHTTPtext(intCode)
      Exit For
    End if
response.flush
  Next
  Response.Write "<p>" & arrURLS(intURL) & " - " & strResponse & "</p>"
  strResponse = ""

Next
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:43 #11
Du kunne jo prøve at læse de ting jeg allerede har skrevet. Du har stadig en lille fejl ;)
Avatar billede neander Nybegynder
23. juli 2004 - 22:47 #12
hmm... jeg har lige flyttet rs.movenext ind i loop'en, havde jeg komplet overset... men hvor skal jeg sætte response.flush helt præcist? er det en anden lille fejl du tænker på?
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:49 #13
det var movenext jeg tænkte på. flush bør du flytte 3 linier ned
Avatar billede neander Nybegynder
23. juli 2004 - 22:49 #14
hmm... nu får jeg en

AspHTTP.Conn error '8000ffff'

Invalid URL

/admin/linkchecker.asp, line 47
Avatar billede neander Nybegynder
23. juli 2004 - 22:50 #15
2 sek, må lige prøve hvor den er 3 linjer nede
Avatar billede neander Nybegynder
23. juli 2004 - 22:52 #16
jo, jeg får samme besked, der går ½ sekund, og så vises resultatet således:

http://www.ext.dk - OK

AspHTTP.Conn error '8000ffff'

Invalid URL

/admin/linkchecker.asp, line 47

linje 47 er:
  HTTPObj.Url = arrURLS(intURL)
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:55 #17
Har du nogen uden http:// foran ?
Avatar billede neander Nybegynder
23. juli 2004 - 22:56 #18
ja, der er nej, hmm... ikke i databasen i hvert fald...
Avatar billede neander Nybegynder
23. juli 2004 - 22:57 #19
YEEEESSSS, nu virker det! jeg satte http:// ind i arrURLS = arrURLS & ",http://" & url

Tak for hjælpen! læg et svar
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:57 #20
Lav en
  response.write arrURLS(intURL)
lige før din linie 47
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:58 #21
Ok, så er det derfor
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 22:58 #22
Og: nej tak, jeg samler slet ikke på point.
Avatar billede neander Nybegynder
23. juli 2004 - 22:58 #23
hmm... øv, den går i stå et sted... må der ikke være specialtegn i url'erne?
Avatar billede neander Nybegynder
23. juli 2004 - 22:59 #24
kan det være fordi der er komma i url'en monstro?
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 23:01 #25
Jah, du bruger jo "," som skilletegn selv. Vælg et andet "mystisk" tegn, som ikke kan forekomme i en url.
Avatar billede neander Nybegynder
23. juli 2004 - 23:05 #26
jeg tror det funker med "£" :o) ses da ikke så ofte i en url, gør det?
Avatar billede erikjacobsen Ekspert
23. juli 2004 - 23:07 #27
Det er vist godt nok. " ", dvs. mellemrum, er også ulovligt, for det skal kodes
som "+" eller "%20", men det sker ikke altid, og enkelte browsere accepterer det
såmænd også.
Avatar billede neander Nybegynder
23. juli 2004 - 23:11 #28
det funger nu, helt som jeg vil ha det. Tusind tak for hjælpen!
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
Kurser inden for grundlæggende programmering

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