抱歉,如果以前有人问过这个问题,但我找不到任何可以回答我的问题的东西。
我们有一个 Coldfusion 脚本,它从我们的网站运行并查询我们办公室的外部 dsn。
问题是服务器位于英国农村,有时服务器不可用(感谢我们不可靠的英国 ISP !!)
Coldfusion 中是否有可以查询或 ping 外部 dsn 的命令,以便我可以将整个脚本包装在 cfif 语句中并在连接失败时收到电子邮件?
抱歉,如果以前有人问过这个问题,但我找不到任何可以回答我的问题的东西。
我们有一个 Coldfusion 脚本,它从我们的网站运行并查询我们办公室的外部 dsn。
问题是服务器位于英国农村,有时服务器不可用(感谢我们不可靠的英国 ISP !!)
Coldfusion 中是否有可以查询或 ping 外部 dsn 的命令,以便我可以将整个脚本包装在 cfif 语句中并在连接失败时收到电子邮件?
这是对邓肯答案的评论的扩展,但不能将代码块放在评论中,所以......
<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 仅确认机器在线,而不是数据库正在响应。)
日军:
<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>
要确定数据源是否有效,只需尝试使用它:
<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无法中断,您仍然可以在十秒后触发电子邮件发送。