Coldfusion 如何跟踪有多少请求绑定到cfcontent服务文件?

Coldfusion 如何跟踪有多少请求绑定到cfcontent服务文件?,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,从那时起,我就只能使用安全地提供文件。现在的问题是,如果文件下载量大,或者连接速度慢,那么CF请求将被占用很长一段时间。如果没有强制执行硬限制的方法,理论上可以在所有请求都与服务文件绑定的情况下关闭CF服务器 我试着在下面做额外的日志记录/逻辑,但我注意到它们从未被访问和执行过 <cfcontent file="test.mp3"> <!--- won't reach here ---> <cfdump output="console" var="#now()#

从那时起,我就只能使用
安全地提供文件。现在的问题是,如果文件下载量大,或者连接速度慢,那么CF请求将被占用很长一段时间。如果没有强制执行硬限制的方法,理论上可以在所有请求都与服务文件绑定的情况下关闭CF服务器

我试着在
下面做额外的日志记录/逻辑,但我注意到它们从未被访问和执行过

<cfcontent file="test.mp3">

<!--- won't reach here --->
<cfdump output="console" var="#now()# download done!">

如何避免因处理过多的cfcontent请求而导致CF停机


更新:好消息

解决方案1

考虑到由于不可控因素(线程“卡住”、服务/服务器关闭等),您很可能无法实现100%的真实记帐,您可以执行以下操作:


如果您只想跟踪总请求,那么可以使用一个应用程序变量,该变量在开始提供文件时递增。然后,当内容完成时,您将减少计数。但是,您需要注意使用cflock以确保此更新不会导致任何问题

如果您想将其记录到一个文件中,您可以做同样的事情,但仍然将其包装在cflock中,以确保在读取/写入文件的同时不会遇到任何问题

如果您使用的是SQL,则可以创建一个表来表示文件,并为每次提取添加一条记录和适当的信息

  • 文件名
  • 作为位完成是/否字段默认为false
  • 用户/客户信息
  • 开始日期/时间默认为现在
  • 结束日期/时间默认为空
  • “下载”状态
  • 还有其他信息吗
使用返回的标识cfcontent更新文件,然后在完成时使用指定ID更新表,更新日期/时间和状态为“成功”,并完成为“是”

在OneError期间,您可以更新该表以反映状态“error[关联的错误详细信息]”并将其完成为1。添加catchall更新以更改为completed=1或清除不可用的记录(可能在应用程序启动期间或一段时间后)不是一个坏主意

这将允许您查询此表中当前挂起的请求总数(以及它们是什么,等等)

然而,这只解决了长时间运行的请求问题

解决方案2

理想情况下,问题是安全地返回文件内容。根据文件的敏感程度(例如,首选私有但不是世界末日,如果不是),您可以将其“复制”到适当的web可访问目录,但使用UUID作为名称。假设它是Secret1.pdf,您可以使用cfdirectory创建一个目录,然后将文件复制到其中。给你这样的东西:

/文件/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxx/Secret1.pdf,然后执行重定向到该目录的操作


然后,您可以设置一个计划任务或网关或任何您喜欢的方法来清除超过设定小时数的目录。例如,从现在起30分钟后删除目录xxxxxxxx-xxxx-xxxx-XXXXXXXXXXXXXX及其所有文件。

许多网站使用的唯一替代方法是将文件复制到安全的requestid,让IIS提供,然后定期或在用户的“会话”结束时清理。@Benkosh-hmm,会话结束并不意味着下载已经完成。我想知道如果它仍然被下载会发生什么。@Henry,我只是用一份我知道速度慢(需要几分钟)且内容丰富的报告做了一个模糊重复的模糊相似的实验。目的是想看看如果用户启动报告,回家,第二天打开excel文件会发生什么。在这种情况下,即使会话超时,该文件仍然可用。@Henry我只是建议一个选项/规则来定义如何清理该文件。Aka,您是否需要活动用户会话等。您可以根据需要处理它…:DAlso请注意,如果安装了9.0.1,则可以在CF9/IIS7上运行mod_xsendfile,然后将连接器重新安装到本机IIS7版本。“然后当内容完成时,减少计数”不起作用,因为无法在cfcontent完成时收听。