【问题标题】:Counting the number of hits in a life cycle method using ColdFusion使用 ColdFusion 计算生命周期方法中的命中数
【发布时间】:2018-08-23 22:23:24
【问题描述】:

我需要显示一些关于调用“OnRequestStart”函数的次数的分析,或者更确切地说是 .cfc 文件中包含的内部 API 的每小时点击次数。最好通过生命周期法;但是计数器必须在生命周期之外继续。我知道这可以用其他语言轻松完成,但我是 ColdFusion 的新手,并且一直在尝试通读文档以查看是否有某种形式的生命周期方法可以用来实现这一目标。如果我缺少任何类型的文档(我已经尝试在一周内学习 cf、cfdocs、adobe 文档),但实际上并没有太多。这可能不是 100% 清楚,但如果需要任何澄清,我很乐意提供帮助。

编辑:我认为最好在 onApplicationStart 中设置一个应用程序变量,并在 onRequest 开始时将计数器变量递增地加 1。这是我的示例代码:

Application.cfc:

<CFFUNCTION NAME="OnApplicationStart" ACCESS="PUBLIC" RETURNTYPE="BOOLEAN">
   <cfset Application.timer EQ 0/>
   <cfset Application.counter EQ 0/>
</CFFUNCTION>

somepage.cfm

<tr> 
    <cfoutput> #Application.counter#</cfoutput>
</tr>

我认为这会起作用,但我收到一条错误消息,提示 Element COUNTER is undefined in APPLICATION. 我有什么遗漏吗?我尝试重新启动 CF 服务器服务和 web 服务器,但没有成功。

感谢大家的帮助

【问题讨论】:

  • 您是要写入日志还是只登录数据库或其他什么?只需创建一个用于记录的函数并在OnRequestStart 中调用它。这是您的 API 还是外部 API?
  • 可能会写入日志,但我还需要在某处显示命中数。内部 API
  • 如果这是您的内部 API,为什么不从 API 本身记录它?
  • 在 API 中,只需在您的 API 中使用 writeLog(text="&lt;API_Name&gt; Called. #application.reqCount# total calls.", type="information", file="apiLog"); 之类的东西(假设它是 CF API),并使用 Redtopia 的脚本也写入 application 范围。但这会在应用程序未重新启动时每次调用 API 时递增。您可能需要不同的时间划分或更持久的计数。
  • 我要再次提醒,application 范围可能是最容易做到的,但如果应用程序在达到阈值之前结束,您将丢失之前的计数。根据您的标准,您可能想研究更具弹性的东西。

标签: coldfusion lifecycle application.cfc coldfusion-2016


【解决方案1】:

将其写入应用程序范围,在onRequestStart()中,包含以下代码:

lock scope="application" type="exclusive" timeout=1 throwontimeout=false {
    if (!application.keyExists("reqCount") {
        application.reqCount= 0;
    }
    application.reqCount++;
}

然后你可以在任何你需要的地方使用它。

【讨论】:

  • 您是否有任何文档可以推荐,以便我了解这完全在做什么?谢谢
  • 很好的答案! OP 并没有明确说明他们是否需要计数超出应用程序范围的生命周期。您的答案将起作用,但 OP 应该知道,如果应用程序重新启动,计数将重置。
  • 根据调用它的位置,您需要验证reqCount 应该从什么开始。如果它来自onRequestStart(),那么 0 将起作用,但如果从 API 中调用,您将希望使用 1,因为它在第一次运行之前不会被调用。
  • @G.Rose,我不知道你会去哪里介绍 CF 文档,但我想那里有很多资源。我的回答假设对 Application 范围的用途以及如何使用它有基本的了解。排他锁的存在是因为多个请求可能同时执行代码。我要做的第一件事是测试变量reqCount 是否存在于应用程序范围内。如果不是,则将其初始化为 0。然后,将其递增。这不是您想要在生产环境中执行的操作,因为您不希望在每个请求上都运行独占锁。
  • @G.Rose,如果您需要在生产环境中执行此操作,最好的办法是使用某种分析工具来汇总您的日志数据。想想“一劳永逸”……换句话说,您记录活动并继续前进。否则,您别无选择,只能创建排他锁以防止竞争条件。登录到数据库同样糟糕,因为您的数据库会创建锁。
【解决方案2】:

事实证明,最简单的方法是在生命周期之外或在 onApplicationStart 内创建一个变量,然后在每个 onRequestStart 中递增该变量。然后,您可以做任何需要的事情。我愚蠢地做的一件事是把&lt;cfset Application.timer EQ 0/&gt; &lt;cfset Application.counter EQ 0/&gt;放在&lt;cfreturn&gt;标签之后。吸取教训,不要假设任何事情,研究一切哈哈。

谢谢大家

【讨论】:

  • 同样,如果您的应用程序或服务器死机,您将失去计数器。如果某些原因导致正常关机,您可以使用onApplicationEnd() 刷新它,但我认为这不会在电源中断或其他服务器崩溃时触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
相关资源
最近更新 更多