webForumDet fria alternativet

vbscript: The maximum amount of time for a script to execute was exceeded

8 svar · 369 visningar · startad av mattiasnordin

mattiasnordinMedlem sedan maj 20012 080 inlägg
#1

Hej hej.

Jag har fått problem med ett skript som modifierar bilder. När jag har ett par hundra bilder i katalogen så får jag ett timeoutfel på skriptet.

Antar att det finns sätt att komma runt detta som tex en bättre design på lösningen. Ideer mottages tackasamt.

<% ' LOOPAR ALLA FILER I VALD KATALOG
	filepath = server.mappath(varFolderPath)
	set fso = server.createobject("scripting.filesystemobject")
	Set folder = fso.GetFolder(filepath)  
	Set folderCollection = folder.SubFolders   
	varBildCount = 1
	for each file in folder.files %>
		<% ' HANTERAR ORGINALFILERNA
		varFileName = lcase(file.name)
		' LETAR EFTER FILER SOM INTE ÄR MODIFIERADE
		 if inStr(varFileName,"_org.") = 0 AND inStr(varFileName,"_sma.") = 0 AND inStr(varFileName,"_med.") = 0 then%>
			<hr><font face=verdana size=5>Hanterar bild <%=varBildCount%></font><p>
			<% 'SKAPAR NYA TUMBNAILS OM FILEN ÄR EN BILD
			if inStr(varFileName,".gif") > 0 OR inStr(varFileName,".jpg") > 0 then
			varBildCount = varBildCount +1 
				call subCreateThumbnails(varFileName) 
			end if%>
			<% response.flush %>
		<% end if %>
	<% next %>
mattiasnordinMedlem sedan maj 20012 080 inlägg
#2

Subben som anropas ser ut så här...

<% sub subCreateThumbnails(varFileName)	
	'Här sparas filen
	filepath = server.mappath(varFolderPath)
	'response.write "<hr>" &filepath  &"<hr>"
	varFileNameAndPath = filepath &"/" &varFileName%>

	<p>1) Hämtar bild för hantering från servens hårddisk: <b><%=varFileName%></b><br>
	Filstorleken är: <b><%=file.size\1024%> kb</b> <p>

<% ' Create instance of AspJpeg
	Set Jpeg = Server.CreateObject("Persits.Jpeg") 
	' Open source image
	Jpeg.Open varFileNameAndPath
	response.write " <p> 2) Nuvarande storlek (upplösning) är:<b> " &Jpeg.OriginalWidth &" x " & Jpeg.OriginalHeight &" pixlar</b><p>"

	'Sätter nytt filnamn på orginalfilen
		varFileExtension = fso.GetExtensionName(varFileNameAndPath) 'Hämtar längden på filändelsen
		varCut = len(varFileExtension)
		varTotalLen = len(varFileName)
		varCut = varTotalLen - varCut
		varNewFileName = left(varFileName,varCut-1)
		varNewFileName = varNewFileName &"_org." &varFileExtension 
	varSaveThis = filepath &"/" &varNewFileName
	Jpeg.Save varSaveThis
	varFileNameOrginal = varNewFileName
	response.write "<p>3) Kopierar filen och byter namn till: <b>" & varNewFileName &"</b> <p>"
	
	
	'Skalar om orginalbilden om den är större än 300 punkter bred
	varSkalaTillDennaBreddNum = 400 '=bredden på bilden.
	if Jpeg.width > varSkalaTillDennaBreddNum then
		' Räkna fram hur många procent som vi vill minska bilden med. Bredden ska vara fixerad.
		varMellanSumman = Jpeg.OriginalWidth - varSkalaTillDennaBreddNum 
		varDecimalProcent = varMellanSumman / Jpeg.OriginalWidth
		' räknar fram hur många pixlar %en motsvarar.
		varTaBortBredd = varDecimalProcent * Jpeg.OriginalWidth 
		varTaBortHojd = varDecimalProcent * Jpeg.OriginalHeight 
		' Skalar om bilderna
		Jpeg.Width = Jpeg.OriginalWidth - varTaBortBredd
		Jpeg.Height = Jpeg.OriginalHeight - varTaBortHojd 
			
		if Jpeg.Height < 100 then	
			' Lägg till vitt
			'response.write "<h1>LÄGG TILL</h1>"	
		elseif Jpeg.Height > 100 then 
			'response.write "<h1>CROP</h1>"	
		end if
		'Sätter nytt filnamn
				varFileExtension = fso.GetExtensionName(varFilePath &"\" &varFileName) 'Hämtar längden på filändelsen
				varCut = len(varFileExtension)
				varTotalLen = len(varFileName)
				varCut = varTotalLen - varCut
				varNewFileName = left(varFileName,varCut-1)
				varNewFileName = varNewFileName &"_med." &varFileExtension 
			varSaveThis = filepath &"/" &varNewFileName
			Jpeg.Save varSaveThis
			varFileNameNormal = varNewFileName
	end if
%>
<p>
4) Ändrar storleken (upplösning) till: <b><%=Jpeg.Width%></b> x  <b><%=Jpeg.Height%> pixlar</b><p>
5) Sparar den omskalade bilden som: <b><%=varNewFileName%></b> <p>
<p>
<%
	' SKAPA LITEN BILD
	' Räkna fram hur många procent som vi vill minska bilden med. Bredden ska vara fixerad.
	varSkalaTillDennaBreddNum = 100 '=bredden på bilden.
	varMellanSumman = Jpeg.OriginalWidth - varSkalaTillDennaBreddNum '=bredden på bilden.
	varDecimalProcent = varMellanSumman / Jpeg.OriginalWidth
	' räknar fram hur många pixlar %en motsvarar.
	varTaBortBredd = varDecimalProcent * Jpeg.OriginalWidth 
	varTaBortHojd = varDecimalProcent * Jpeg.OriginalHeight 
	' Skalar om bilderna
	Jpeg.Width = Jpeg.OriginalWidth - varTaBortBredd
	Jpeg.Height = Jpeg.OriginalHeight - varTaBortHojd 
		
	if Jpeg.Height < 100 then	
		' Lägg till vitt
		'response.write "<h1>LÄGG TILL</h1>"	
	elseif Jpeg.Height > 100 then 
		'response.write "<h1>CROP</h1>"	
	end if
		'Sätter nytt filnamn
			varFileExtension = fso.GetExtensionName(varFilePath &"\" &varFileName) 'Hämtar längden på filändelsen
			varCut = len(varFileExtension)
			varTotalLen = len(varFileName)
			varCut = varTotalLen - varCut
			varNewFileName = left(varFileName,varCut-1)
			varNewFileName = varNewFileName &"_sma." &varFileExtension 
		' create thumbnail and save it to disk
		varSaveThis = filepath &"/" &varNewFileName
		Jpeg.Save varSaveThis 
		varFileNameThumb = varNewFileName
		%>

6) Ändrar storleken (upplösning) till: <b><%=Jpeg.Width%></b> x  <b><%=Jpeg.Height%> pixlar</b><p>
7) Sparar den omskalade bilden som: <b><%=varNewFileName%></b>  <p>

<% ' RADERAR ORGIANLBILDEN EFTER ATT NYA HAR SKAPATS
	Set file = fso.GetFile(varFileNameAndPath)  
	file.delete %>

8) Raderar filen: <b><%=varFileName%></b><p>
	

<!--- Lägger till filerna i databasen --->

			
	<p>
	9) Sparar filnamnen i databasen med en insert <b><%=varFileNameOrginal%></b> &nbsp;,&nbsp; <b><%=varFileNameNormal%></b> &nbsp;,&nbsp; <b><%=varFileNameThumb%></b>
	<p>
	
	<%' KONTROLLERAR OM FILEN REDAN FINNS I DATABASEN
	sql = "SELECT id FROM T_bild_register WHERE bild_path_orginal = '" &varFileNameOrginal &"' AND album_id =" &sTillAlbumId
	set rs = connect.execute(sql) 
	if rs.eof then
		'FILEN FINNS INTE I DATABASEN
		'LÄGG TILL DEN
		sql_question = "INSERT INTO T_bild_register (bild_path_orginal, bild_path_normal, bild_path_thumb, album_id) "
		sql_question = sql_question &" VALUES "
		sql_question = sql_question &"('" &varFileNameOrginal &"',"
		sql_question = sql_question &"'" &varFileNameNormal &"',"
		sql_question = sql_question &"'" &varFileNameThumb &"',"
		sql_question = sql_question &"" &sTillAlbumId &")"
		 response.write "<p><b>DEBUG Insert databasen:</b> " &sql_question &"<p>"
		connect.execute(sql_question)
	else
	response.write("<font color=red>ERROR: DETTA SKULLE INTE KUNNA INTRÄFFA. DATABASEN INNEHÅLLER REDAN DETTA FILNAMN. SE indexera_nya_bilder.asp</font>") 
	end if
%>

<% end sub %>
@ndersMedlem sedan juni 200032 969 inlägg
#3

Om du inte har något emot att vänta en liten stund kan du ju alltid sätta upp timeouten...

emissionMedlem sedan dec. 19996 721 inlägg
#4

LIte stökig kod, och vissa saker görs flera gånger i onödan (filnamnen t.ex.) men generellt såg det ut som om den gjorde rätt saker. Bildskalningen kanske helt enkelt tar för lång tid, och då får du ställa upp Server.ScriptTimeout

mattiasnordinMedlem sedan maj 20012 080 inlägg
#5

Ja att det är stökigt ska jag fixa... håller på med någon sorts grovskiss just nu.

Något som jag funderar över är varför inte <% response.flush %> skriver ut infromationen bild för bild. Som det är nu så tar det x antal sekunder (ganska många) sedan kommer allt, inklusive timeoutfelet.

Rad 1 = <% response.buffer = true %>

Trodde inte att det behövdes något mer ?!

mattiasnordinMedlem sedan maj 20012 080 inlägg
#6

Antar att man har följande syntax:

<%
response.buffer = true 
Server.ScriptTimeout = 2000 
%>

Vad är vanligt värde på server.scriptTimeout? Jag hittade ovan när jag sökte här på forumet.

@ndersMedlem sedan juni 200032 969 inlägg
#7

Jag har för mig att 120 (sekunder) är defaultvärdet på scripttimeouten, om det var det du undrade.

mvh

desdecadoMedlem sedan juli 2004206 inlägg
#8

mattiasnordin skrev:

Ja att det är stökigt ska jag fixa... håller på med någon sorts grovskiss just nu.

Något som jag funderar över är varför inte <% response.flush %> skriver ut infromationen bild för bild. Som det är nu så tar det x antal sekunder (ganska många) sedan kommer allt, inklusive timeoutfelet.

Rad 1 = <% response.buffer = true %>

Trodde inte att det behövdes något mer ?!

...flush skickar ju kontinuerligt html till webläsaren, så egentligen skickar den ju inte bilden. Bilden hämtas ju ifrån webläsaren när denna bestämmer sig för att det är dags, och detta beror ju på hur du anropar bilden i htmlsidan.

mattiasnordinMedlem sedan maj 20012 080 inlägg
#9

Hmmm.... Tänkte att jag åter skulle se om jag kunde hitta en lösning på mitt problem med response.flush.

Som det är nu så visas resultatet först när allt är klart eller att jag har fått mitt timeoutfel. Jag skulle kunna leva med att sätta timeouten till jättehögt om jag bara fick någon feedback från skriptet att något händer.

Några ideer ?

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)