我们有一个从我们的网站运行的Coldfusion脚本,并在办公室中查询外部dsn。
问题是服务器位于英国乡村,有时服务器不可用(感谢我们不可靠的英国ISP !!)
coldfusion中是否有可以查询或ping外部dsn的命令,因此我可以将整个脚本包装在cfif语句中,如果连接失败则会收到电子邮件?
答案 0 :(得分:3)
这是对duncan答案的评论的扩展,但不能将代码块放在评论中,所以......
<cfset TargetHost = "0.0.0.0" />
<cfset PingAttempts = 4 />
<cfif find('Windows',Server.Os.Name)>
<cfset Args = "-n #PingAttempts# #TargetHost#" />
<cfelse>
<cfset Args = "-c #PingAttempts# #TargetHost#" />
</cfif>
<cfexecute name="ping" arguments=#Args# variable="PingResult" timeout=10 />
<cfif PingResult CONTAINS "100% packet loss"
OR PingResult CONTAINS "100% loss"
>
[send alert]
</cfif>
<cfdump var=#PingResult# />
(一般情况下,我仍然会通过实际查询进行检查 - ping只会确认机器在线,而不是数据库正在响应。)
答案 1 :(得分:2)
JFGI:
<cfexecute name="C:\winnt\system32\ping.exe" arguments="#request.myIP#" variable="myPing" timeout="8"></cfexecute>
或者在Linux / Unix上:
<cfexecute name="ping" arguments="#request.myIP# -c 3" timeout="10" variable="myPing" />
<cfif myPing contains "Request timed out">
<cfmail ...>
<cfelse>
[do something else]
</cfif>
答案 2 :(得分:2)
要确定数据源是否有效,请尝试使用它:
<cftry>
<cfquery datasource="external" timeout=10 >
SELECT 1
</cfquery>
<cfcatch>
<cfif [timeout error]>
<cfmail ...>No response in 10 seconds</cfmail>
<cfelse>
[do something else]
</cfif>
</cfcatch>
</cftry>
由于这似乎不起作用,另一种选择可能是:
<cfthread action="run" name="QueryThread">
<cfquery datasource="external">SELECT 1</cfquery>
</cfthread>
<cfthread action="run" name="CheckThread">
<cfthread action="sleep" duration="10000" />
<cfif cfthread.QueryThread.Status NEQ 'COMPLETED'>
[handle error]
<cfthread action="terminate" name="QueryThread" />
</cfif>
</cfthread>
相同的概念,但使用多个线程应该意味着即使查询太深而CF无法中断,您仍然可以在十秒钟后触发电子邮件发送。