在 ColdFusion 中,有没有办法确定代码在哪个服务器上运行?

Posted

技术标签:

【中文标题】在 ColdFusion 中,有没有办法确定代码在哪个服务器上运行?【英文标题】:In ColdFusion, is there a way to determine what server the code is running on? 【发布时间】:2010-10-24 06:23:16 【问题描述】:

ColdFusion 代码中是否有任何方法可以确定代码在哪个服务器上执行?我有几个负载平衡的 ColdFusion 服务器。当我捕获异常时,我希望能够知道代码在哪个服务器上运行,因此我可以将该信息包含在日志记录/报告代码中。

如果重要的话,服务器是 Windows 2003/IIS。我也很想知道如何在 Linux/Apache 中做到这一点。 :-)

【问题讨论】:

【参考方案1】:

我相信CGI.SERVER_NAME 会得到你想要的。

根据评论编辑:您也许可以做一些更“低级”的事情......

<cfset inet = CreateObject("java", "java.net.InetAddress")>  
<cfdump var = "#inet.getLocalhost().gethostname()#">  

(这里没有 CF 服务器在工作,所以我无法测试)。

【讨论】:

我不这么认为。它将包含面向客户端的服务器名称。无法找到您所在的实际机器。 在负载平衡场景中这还不够吗? 客户端看到一个服务器名称。假设有 2 台服务器。您如何使用一个服务器名称找出您所在的服务器? Java版比较像。 +1 ColdFusion 支持 JavaBeans 语法,所以 就足够了。确认工作正常。【参考方案2】:

你可以用Server Variables点赞

server.coldfusion.appserver 
server.coldfusion.expiration    
server.coldfusion.productlevel
server.coldfusion.productname   
server.coldfusion.productversion
server.coldfusion.rootdir   
server.coldfusion.serialnumber  
server.coldfusion.supportedlocales
server.os.additionalinformation 
server.os.arch  
server.os.buildnumber   
server.os.name  
server.os.version

将您的代码调整到特定平台。发送&lt;cfdump var=”#SERVER#” /&gt; 以查看适用于您的 Coldfusion 版本的内容。

您可以通过 Java 调用获取主机名:

<cfscript>
machineName = createObject("java", "java.net.InetAddress").localhost.getHostName();
instanceName = createObject("java", "jrunx.kernel.JRun").getServerName();
</cfscript>

【讨论】:

【参考方案3】:

这可能会帮助您进一步...

<cfscript>
machineName = createObject("java", "java.net.InetAddress").localhost.getCanonicalHostName();
hostaddress = createObject("java", "java.net.InetAddress").localhost.getHostAddress();
</cfscript>
<cfdump var="#machineName#"><br />
<cfdump var="#hostaddress#"><br />

【讨论】:

【参考方案4】:

查找有关正在执行的 JRun 进程的信息的另一个地方是实例化以下内容:

<cfset oErrorJRun = createObject("java","jrunx.kernel.JRun")/>
<cfset strServerName = oErrorJRun.ServerName />

这将为您提供正在执行代码的 JRun 实例的名称。我们遇到过这样的情况,在我们的集群环境中,一个节点上的 IIS 将记录页面命中,但另一个节点上的 JRun 将处理请求。有时,我们会让一个节点的 JRun 停止响应,我们需要重新启动一些服务以将流量返回到该节点。我在我的错误处理程序插件中使用上述代码将服务器名称粘贴在我发送给管理员的电子邮件中,并将其合并到我编写调试信息的文件名中。

【讨论】:

【参考方案5】:

使用以下代码获取域名。

<cfoutput>#cgi.server_name#</cfoutput>

希望这是你所期待的。

【讨论】:

如果您阅读对existing answer that suggested this 的comment,您会发现这不是一个有效的答案。【参考方案6】:

对于我们使用负载平衡代理后面的节点,我最终调用了“主机名”命令,也适用于 Windows - 所以这里是集合:

<cfscript>
machineName = createObject("java", "java.net.InetAddress").localhost.getCanonicalHostName();
hostaddress = createObject("java", "java.net.InetAddress").localhost.getHostAddress();
</cfscript>
<cfdump var="#machineName#"><br />
<cfdump var="#hostaddress#"><br />
<cfdump var="#CGI.SERVER_NAME#"><br />
<cfexecute name = "hostname" timeout = "1"></cfexecute>

【讨论】:

【参考方案7】:
<cffunction name="getMachineName" returntype="string" access="private" output="false" hint="Server Name">
    <cftry>
        <cfexecute
            name="hostname"
            arguments=""
            variable="local.machineNameResult"
            timeout=10 />
            <cfreturn Trim(local.machineNameResult)>
        <cfcatch type="any">
            <cfdump var="#cfcatch#">
            <cfabort>
        </cfcatch>
    </cftry>
</cffunction>

<cfdump var="#getMachineName()#" />
<cfabort />

【讨论】:

以上是关于在 ColdFusion 中,有没有办法确定代码在哪个服务器上运行?的主要内容,如果未能解决你的问题,请参考以下文章

在 ColdFusion UDF 中,有没有办法从父函数范围引用变量?

ColdFusion 生成代码以创建数据库表

如何在 ColdFusion 中获取计划任务列表和上次运行结果?

如何在ColdFusion 2016中动态设置电子表格自动过滤器?

如何在应用程序超时时重新启动Coldfusion Application Server?

调用 .NET Web 服务的 ColdFusion 代码