使用ColdFusion计算生命周期方法中的命中数

使用ColdFusion计算生命周期方法中的命中数,coldfusion,lifecycle,application.cfc,coldfusion-2016,Coldfusion,Lifecycle,Application.cfc,Coldfusion 2016,我需要显示一些关于“OnRequestStart”函数被调用多少次的分析,或者更确切地说是.cfc文件中包含的内部API每小时的点击次数。优选通过生命周期方法;但是,计数器必须在生命周期之外继续运行。我知道用其他语言可以很容易地做到这一点,但我对ColdFusion是新手,一直在努力阅读文档,看看是否有某种形式的生命周期方法可以用来实现这一点。如果我缺少任何类型的文档(我已经试着在一周内学习了cf、cfdocs、adobe文档),但实际上没有太多。这可能不是100%清楚,但如果有任何澄清需要我会

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

编辑:我认为最好在onApplicationStart中设置一个应用程序变量,并在OnRequestStart中向计数器变量递增添加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>

#应用程序计数器#
我原以为这会起作用,但我得到一个错误,说
元素计数器在应用程序中未定义。
我缺少什么吗?我试图重新启动CF服务器服务和web服务器,但没有成功


感谢大家的帮助

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

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

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

事实证明,最简单的方法是在生命周期之外或在onApplicationStart中创建一个变量,然后在每个onRequestStart中递增该变量。之后你可以做任何需要做的事情。有一件事我做得很愚蠢,就是把
放在
标签后面。吸取的教训,不要假设任何事情,研究一切哈哈


谢谢大家

您是想写日志还是只想登录数据库或其他什么?只需创建一个日志函数并在
OnRequestStart
中调用它。这是您的API还是外部API?可能会写入日志,但我还需要在某处显示命中数。内部API如果这是您的内部API,为什么不直接从API本身记录它呢?在API内部,只需使用类似于
writeLog(text=“Called.#application.reqCount#total calls.”,type=“information”,file=“apiLog”)的东西代码(假设它是CF API),并使用Redtopia的脚本也写入
应用程序
范围。但是,在应用程序尚未重新启动时,每次调用API时,该值都会增加。您可能需要不同的时间分割或更持久的计数。我要再次提醒您,
应用程序
范围可能是最容易做到的,但是如果应用程序在达到阈值之前结束,您将丢失以前的计数。根据您的标准,您可能希望研究更具弹性的内容。是否有您推荐的文档,以便我能够完全理解这是在做什么?谢谢你回答得好!不过OP没有明确说明他们是否需要在应用程序范围的生命周期之外使用计数。您的答案将起作用,但OP应该知道,如果应用程序重新启动,计数将重置。根据调用的位置,您需要验证
reqCount
的起始位置。如果它来自
onRequestStart()
,那么0将起作用,但是如果从API中调用,您将希望使用1,因为它在第一次运行之前不会被调用。@G.Rose,我不知道您将在哪里获得CF文档的介绍,但我想那里有很多资源。我的回答假设对应用程序范围的用途和使用方法有基本了解。存在独占锁是因为多个请求可以同时执行代码。我要做的第一件事是测试变量
reqCount
是否存在于应用程序范围中。如果不是,则将其初始化为0。然后,它增加它。这不是您希望在生产中执行的操作,因为您不希望在每个请求上都运行独占锁。@G.Rose,如果您需要在生产中执行此操作,您最好使用某种分析工具来聚合日志数据。想想“开火然后忘记”。。。换句话说,您需要记录活动并继续。否则,您别无选择,只能创建独占锁以防止竞争条件。登录到数据库也同样糟糕,因为数据库会创建锁。同样,如果应用程序或服务器死亡,您将丢失计数器。如果有什么东西导致正常关机,您可以使用
onaapplicationend()
刷新它,但我认为这不会在电源中断或其他服务器崩溃时触发。