1

抱歉,如果以前有人问过这个问题,但我找不到任何可以回答我的问题的东西。

我们有一个 Coldfusion 脚本,它从我们的网站运行并查询我们办公室的外部 dsn。

问题是服务器位于英国农村,有时服务器不可用(感谢我们不可靠的英国 ISP !!)

Coldfusion 中是否有可以查询或 ping 外部 dsn 的命令,以便我可以将整个脚本包装在 cfif 语句中并在连接失败时收到电子邮件?

4

3 回答 3

3

这是对邓肯答案的评论的扩展,但不能将代码块放在评论中,所以......

<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 仅确认机器在线,而不是数据库正在响应。)

于 2013-08-15T13:59:27.267 回答
2

日军:

<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>

http://www.bennadel.com/blog/751-Learning-ColdFusion-8-Ping-User-Defined-Function-Inspired-By-Ray-Camden-.htm

于 2013-08-15T10:41:25.237 回答
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无法中断,您仍然可以在十秒后触发电子邮件发送。

于 2013-08-15T11:43:38.753 回答