ColdFuisonでのリクエストのタイムアウトは、期待どおりに動作しません。リクエストが実行されている時間をチェックし、リクエストのタイムアウト時またはその直後にそれを強制終了するウォッチドッグがあることを想像してみてください。実際に発生しているように見えるのは、特定のタグが実行された場合にのみ、CFが要求の経過時間が設定された制限を超えているかどうかをチェックすることです。<cfoutput>
はチェックするタグの1つです。そのため、実行に時間がかからないことがわかっていても、cfoutputを指すタイムアウト超過メッセージが頻繁に表示されます。
<cfsetting requesttimeout="5" enableCFoutputOnly="no" />
<!--- Looping with a condition <cfloop blamed --->
<cfset request.counter=0 />
<cfloop condition="true">
<cfset sleep(1000) />
<cfset request.counter=request.counter+1>
<cflog file="timeout" text="#request.counter#">
<cfif request.counter GT 8>
<cfbreak>
</cfif>
</cfloop>
<!--- Looping with an index, times out, naming CFLOOP as the offending tag --->
<cfloop index="foo" from="1" to="8">
<cfset sleep(1000) />
</cfloop>
<!--- Looping with an index, times out, naming CFOUTPUT as the offending tag --->
<cfloop index="foo" from="1" to="8">
<cfset sleep(1000) />
<cfoutput>Hello</cfoutput>
</cfloop>
<!--- Same loop, but in script. No timeout warning at all --->
<cfscript>
for(foo=1;foo<=8;foo++){
sleep(1000);
}
</cfscript>
<!--- Same loop, now with WriteOutput() called. Still no timeout --->
<cfscript>
for(foo=1;foo<=8;foo++){
sleep(1000);
writeoutput("tick...");
}
</cfscript>
上記のコードは、requesttimeoutの奇妙な動作の一部を示しています。Mark Krugerが指摘したように、外部リソースへの呼び出しはタイムアウトのチェックを行わないことを意味し、独自のロジックを実行しているだけのスクリプトの大きなブロックもチェックされず、次の出力ステートメントが非難されることになります。
コードが遅れている場所を追跡する必要があり、タイムアウトメッセージが間違った場所を指している場合は、長時間実行されているコードの実行中に、ロギングまたはjstackを使用してサーバーからスタックトレースを取得します。数秒間隔でいくつかのスタックトレースを取得し、 Samuraiを介してログファイルを実行して、コードが何を実行しているかを確認します。