是否可以使用 onCFCRequest 或类似函数将数据从 cfc 写入调用者请求范围?

Nic*_*las 6 coldfusion application.cfc cfml lucee

我想启动一些请求日志记录,更重要的是,我的应用程序中的查询。Lucee 使这变得非常简单,我可以在 onRequestEnd 函数中使用几行代码记录任何给定页面中运行的所有查询:

<cfset getQueries   = getPageContext().variablesScope()>
<cfset queryArr     = ArrayNew(2)>
<cfset x            = 0>
<cfloop collection="#getQueries#" item="key">
    <cfif IsQuery(getQueries[key])>
        <cftry>
            <cfset thisQ            = getQueries[key]>
            <cfset thisQT           = thisQ.getExecutionTime() / 1000000>
            <cfset thisSQL          = thisQ.getSQL().getSQLString()>

            <cfset x                = x + 1>
            <cfset queryArr[x][1]   = thisQT>
            <cfset queryArr[x][2]   = thisSQL>
            <cfcatch>
            
            </cfcatch>
        </cftry>
    </cfif>
</cfloop>
Run Code Online (Sandbox Code Playgroud)

这给了我一个数组,其中包含每个查询的 SQL(绑定变量用 ? 表示)和执行时间。我可以将它插入到日志数据库中,并从中获得各种乐趣。

问题是我有很多页面调用 CFC,它们运行查询然后返回数据:

<cfset someVar  = createObject("component","cfc.test").getSomeData(ID=7)>
Run Code Online (Sandbox Code Playgroud)

在我编写日志代码后,我意识到 CFC 中的查询(我的大部分数据处理)没有被记录下来,因为它们当然是在自己的范围内运行的。我也在寻找一种简单的方法来记录 CFC 中的查询。

几分钟前我从未听说过 onCFCRequest(当谷歌启发我时),我找不到关于它使用的太多信息。我希望它可以像 onRequest 一样工作,我可以做这样的事情:

<cffunction name="onCFCRequest">
    <cfargument type="String" name="cfcName"    required=true/>
    <cfargument type="String" name="methodName" required=true/>
    <cfargument type="struct" name="args"       required=true/>
    
    <cfset caller.getLog    = getLog>

</cffunction>
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,我尝试过的任何其他变体也不起作用。事实上,这个函数似乎根本不起作用,因为这段代码没有在我的测试表中插入任何内容:

<cffunction name="onCFCRequest">
    <cfargument type="String" name="cfcName"    required=true/>
    <cfargument type="String" name="methodName" required=true/>
    <cfargument type="struct" name="args"       required=true/>
    
    <cfquery>
        insert into testTable       (f1, f2)
                    values          (<cfqueryparam cfsqltype="cf_sql_varchar" value="test1">,
                                     <cfqueryparam cfsqltype="cf_sql_varchar" value="test2">)
    </cfquery>

</cffunction>
Run Code Online (Sandbox Code Playgroud)

使用 onCFCRequest 的正确方法是什么,它能否用于将数据从 cfc 的本地范围写入父/调用方请求范围?如果没有,是否有另一个函数(如 onCFCRequestEnd)可用于执行此操作?我不想对应用程序中的每个 cfQuery 或 cfc 文件进行大规模更改来实现此目标。

我知道有一些商业应用程序旨在做得更好,我只需几个小时的编码就可以做到这一点。不过,这是一个我花钱买不起的个人网站,自己做的经验很有启发。

Seb*_*ner 0

由于您的实际问题是如何记录所有查询执行,无论它们发生在何处,我认为有两种方法可以做到这一点。

启用日志记录

每当执行查询时,您都可以将 SQL 字符串和参数写入日志。

您可以在 Lucee Admin 中将日志记录设置到您希望的数据库表中。

Lucee Web Admin 日志记录设置

设置完成后,您需要调用<cflog>并使用属性中指定日志的名称file

<cflog>这种方法的缺点是每次执行查询时都必须手动放置 a 。通过将所有数据库通信集中在一个同时进行日志记录的函数中,可以缓解这种情况。因此,每当您想要查询某些内容时,您都可以调用该函数,而不是<cfquery>手动调用。

启用调试

Lucee 的调试功能允许您输出在页面运行中执行的所有查询以及其他有用信息。

首先需要添加调试模板:

重要提示:预定义模板仅将数据输出到您网站生成的 HTML。尽管您可以创建自己的调试模板。为此,您需要在其中创建自己的模板 CFClucee-server/context/context/admin/debug/并为其提供唯一的名称。还有一个幻灯片展示了如何创建自己的Lucee 背后的调试模板,Gert Franz,其中更详细地解释了如何做到这一点。

正确完成后,您应该会看到模板类型下拉列表中列出的模板名称。

Lucee Web Admin 调试模板

然后,您需要做的就是启用数据库活动的调试:

Lucee Web Admin 数据库活动调试已启用