我应该使用cfobject或cfinvoke进行重复性任务吗?

时间:2012-08-24 18:19:07

标签: loops coldfusion cfinvoke

我需要遍历一组图像路径来抓取,调整大小并将图像从外部目标存储到S3。

我习惯于这样调用cfcs:

<cfinvoke component="form_img_handler" method="upload" returnvariable="imgSuccess">
    <cfinvokeargument name="command" value="upload_search"/>
    <cfinvokeargument name="imgPath" value="#results.bildpfad #"/>
    <cfinvokeargument name="imgFile" value="#results.bilddateiname#"/>
    <cfinvokeargument name="sellerILN" value="#results.iln#"/>
    <cfinvokeargument name="cookie" value="#variables.screenWidth#"/>
</cfinvoke>

问题:
如果我必须在循环中执行此操作25x,那么使用cfobject代替cfinvoke会更好吗?根据我的理解cfinvoke实例化,运行它的工作并消失。虽然cfobjects可以留下来。如果是这样,在上述情况下使用cfobject会更好吗?如果是这样,我将如何调用upload函数(传递参数)以及如何在完成后删除对象?

(以前从未使用过cfobject ......)

感谢您的帮助!

2 个答案:

答案 0 :(得分:10)

也不要使用像...这样的东西。

外部循环(可能在全局范围内,例如应用程序):

<cfset form_img_hander = createObject('component','dotted.path.to.form_img_hander') />
or
<cfset form_img_hander = new dotted.path.to.form_img_hander() />

内圈:

<cfset imgSuccess = form_img_handler.upload
    ( command   = "upload_search"
    , imgPath   = results.bildpfad
    , imgFile   = results.bilddateiname
    , sellerILN = results.iln
    , cookie    = variables.screenWidth
    )/>

因为更具可读性。


您没有性能问题除非您有可重复的测试用例,证明您遇到了性能问题。


关于删除对象......
如果您没有将对象放在持久范围内,则无需担心删除它们 - 它们仅与请求相关联,一旦请求结束,它们将根据需要进行垃圾收集。

如果您将对象放在持久范围内,可能仍然不需要担心删除它们,但如果您确定要删除它们,则可以使用StructDelete将其删除(仅像任何其他变量)。当然,在需要的时候你应该注意不要这样做。

答案 1 :(得分:4)

使用CreateObject实例化您的对象并将其分配给变量:

<cfset handler = CreateObject("component", "form_img_handler")>
<cfset handler.upload(URL.command, URL.imgPath ... )>

在实例化对象一次之后,可以在循环中调用第二行。