26. oktober 2007 - 14:57Der er
18 kommentarer og 1 løsning
Gemme aktuel side på serveren
Hej jeg har et stort problem. Det haster som en i ........ Derfor også alle de pts.
Jeg har en asp side, som skal vise nogle data fra en database. Samtidig med at siden er oppe i browseren vil jeg gerne have den gemmer en HTML kopi på serveren så den kan findes senere. Jeg har kigget lidt på FSO er det vejen frem?
Hvis de ting du skal gemme laves i asp'en, så kan du jo imens at du henter tingene fra db, lave en string med al html'en der bliver genereret. Når du så er færdig, så skriver du den string til en fil med FSO - som du selv foreslår.
<% fs=Server.CreateObject("Scripting.FileSystemObject") .CreateTextFile("c:\test.txt",true) fs.WriteLine(ASPSTRING) fs.Close set fs=nothing %>
w13 -> den skal gemmes på serveren. soerenlyn -> Kan se den gemmes som txt fil, den skulle gemme HTML men det er måske ligegyldigt?
Filen skal bruges for at andre kan se hvad pågældende bruger har fået en kopi af den gang han lavede den, altså en slags "backup" af nøjagtig den samme visning.
Hvis strengen der gemmes, er det du også sender til brugerens browser (med response.write), så vil filen der gemmes indeholde det samme (uanset om den hedder .txt) - men det er jo frit for dig om du vil kalde den .htm i stedet... :)
Du skal så sørge for at erstatte alle dine Response.Write-sætninger med en strengbuffer for at du kan gemme indholdet til en fil. Du kan f.eks. lave en strengbuffer med et array som du så join'er til en streng efter siden er genereret. Det er væsentlig hurtigere end at lave strengsammensætning med ampersand (&).
Ok så prøver jeg lige om jeg kan skrue et eller andet sammen. Er der nogen grænse for hvor stor en variabel kan blive? Jeg tænker lidt på om der evt. komme lidt problemer, for siden kan godt risikere at blive MEGET stor.
Der er naturligvis en grænse for hvor stor en streng kan blive og den teoretiske grænse for en streng i VBScript er nok omkring 2Gb (jeg håber ikke det er så store side du afleverer til dine brugere! :D)...
Men du kan løbe i nogle gevaldige performanceproblemer, hvis du ikke fra starten optimerer din strenghåndteringsprocess. VBScript er notorisk langsom til almindelige strengsammensætninger, specielt hvis de bliver store og der er mange af dem. Jeg har lavet nogle tests på et tidspunkt og det var altså voldsomme forskelle på en array-baseret strengbuffer og normal strengsammensætning.
Følgende burde give dig et performanceboost på denne front (jeg har godt nok ikke testet den, men princippet burde være til at overskue):
class StringBuilder private m_buffer() ' bufferen som skal holde de enkelte strengelementer private m_lastIdx ' sidste indsættelsesposition i bufferen private m_bufferlen ' antal elementer bufferen skal indeholde private m_bufferinc ' antal elementer bufferen skal udvides med ved overløb
sub class_terminate() m_lastIdx = 0 m_bufferlen = 1000 m_bufferinc = 500 redim m_buffer(m_bufferlen) end sub
property get bufferlen bufferlen = m_bufferlen end property
property let bufferlen(value) m_bufferlen = value dim tmp tmp = toString redim m_buffer(m_bufferlen) m_buffer(0) = tmp m_lastIdx = 1 end property
property get bufferinc bufferinc = m_bufferinc end property
property let bufferinc(value) m_bufferinc = value end property
sub append(s) if m_lastIdx > m_bufferlen then bufferlen = bufferlen + bufferinc end if m_buffer(m_lastIdx) = s end sub
function toString() toString = join(m_buffer,"") end function end class
' TEST KLASSEN! dim sb set sb = new StringBuilder
for i = 1 to 2000 sb.append "Dette skal blive" sb.append " til en længere streng" sb.append " og dette er element nr.: " sb.append i next
' SEND INDHOLDET AF BUFFEREN TIL BROWSEREN Response.Write sb.toString
OK, har lige testet lidt og der var nogle småbugs som er rettet og denne version burde fungere:
<% class StringBuilder private m_buffer() ' bufferen som skal holde de enkelte strengelementer private m_lastIdx ' sidste indsættelsesposition i bufferen private m_bufferlen ' antal elementer bufferen skal indeholde private m_bufferinc ' antal elementer bufferen skal udvides med ved overløb
sub class_initialize() m_lastIdx = 0 m_bufferlen = 1000 m_bufferinc = 500 redim m_buffer(m_bufferlen) end sub
property get bufferlen bufferlen = m_bufferlen end property
property let bufferlen(value) m_bufferlen = value dim tmp tmp = toString redim m_buffer(m_bufferlen) m_buffer(0) = tmp m_lastIdx = 1 end property
property get bufferinc bufferinc = m_bufferinc end property
property let bufferinc(value) m_bufferinc = value end property
sub append(s) if m_lastIdx > m_bufferlen then bufferlen = bufferlen + bufferinc end if m_buffer(m_lastIdx) = s m_lastIdx = m_lastIdx + 1 end sub
function toString() toString = join(m_buffer,"") end function end class
' TEST KLASSEN! dim sb set sb = new StringBuilder
for i = 1 to 2000 sb.append "Dette skal blive" sb.append " til en længere streng" sb.append " og dette er element nr.: " sb.append i next
' SEND INDHOLDET AF BUFFEREN TIL BROWSEREN Response.Write sb.toString
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.