Amazon S3 - 当文件被s3cmd删除时,ColdFusion的fileExists会中断

时间:2014-12-01 10:54:19

标签: amazon-web-services coldfusion amazon-s3 coldfusion-9 s3cmd

我正在ColdFusion 9上运行一个站点,该站点将缓存的信息存储在Amazon S3上。

ColdFusion应用程序构建文件并将它们放入Amazon S3。每隔N小时,缓存会被执行s3cmd del的bash脚本刷新,因为它比ColdFusion的fileDeletedirectoryDelete更有效。

但是,在s3cmd删除文件后,ColdFusion仍会将其标记为现有文件,即使它无法读取其内容。

对于ColdFusion应用程序,我在Application.cfc上提供了S3凭据,它们与s3cmd使用的身份验证密钥相同,因此我认为这不是用户权限问题。

让我们来看看这个过程:

// Create an S3 directory with 3 files
fileWrite( myBucket & 'rabbits/bugs-bunny.txt', 'Hi there, I am Bugs Bunny' );
fileWrite( myBucket & 'rabbits/peter-rabbit.txt', 'Hi there, I am Peter Rabbit' );
fileWrite( myBucket & 'rabbits/roger-rabbit.txt', 'Hi there, I am Roger Rabbit' );

writeDump( var = directoryList(myBucket & 'rabbits/', 'true', 'name' ), label = 'Contents of the rabbits/ folder on S3' );

enter image description here

// Delete one of the files with ColdFusion's fileDelete
fileDelete( myBucket & 'rabbits/roger-rabbit.txt' );

writeDump( var = directoryList(myBucket & 'rabbits/', 'true', 'name' ), label = 'Contents of the rabbits/ folder on S3' );

enter image description here

// Now, let's delete a file using the command line:
[~]$ s3cmd del s3://myBucket/rabbits/peter-rabbit.txt
File s3://myBucket/rabbits/peter-rabbit.txt deleted

writeDump( var = directoryList(myBucket & 'rabbits/', 'true', 'name' ), label = 'Contents of the rabbits/ folder on S3' );

enter image description here

// So far, so good!
// BUT!... ColdFusion still thinks that peter-rabbit.txt exists, even
// though it cannot display its contents

writeOutput( 'Does bugs-bunny.txt exist?: ' & fileExists(myBucket & 'rabbits/bugs-bunny.txt') );
writeOutput( 'Then show me the content of bugs-bunny.txt: ' & fileRead(myBucket & 'rabbits/bugs-bunny.txt') );

writeOutput( 'Does peter-rabbit.txt exist?: ' & fileExists(myBucket & 'rabbits/peter-rabbit.txt') );
writeOutput( 'Then show me the content of peter-rabbit.txt: ' & fileRead(myBucket & 'rabbits/peter-rabbit.txt') );
// Error on fileRead(peter-rabbit.txt) !!!

enter image description here

2 个答案:

答案 0 :(得分:2)

我同意@MarkAKruger的评论,这里的问题是延迟。

鉴于ColdFusion无法一致地判断文件是否存在,但是它始终读取其最新内容(并且在它们不可用时始终无法读取它们),我已经提出了这个解决方案:

string function cacheFileRead(
    required string cacheFileName
){
    var strContent = '';

    try{
        strContent = FileRead( ARGUMENTS.cachefileName );
    }catch(Any e){
        strContent = '';
    }

    return strContent;
}

答案 1 :(得分:1)

这个答案假定延迟是你的问题,正如我在上面的评论中断言的那样。

我想我会跟踪s3cmd运行的时间。如果通过CFEXECUTE运行它,则在应用程序范围或文件或数据库表中存储时间戳。然后,当检查文件时,如果命令已在最后 N 分钟内运行(您必须尝试找出有意义的内容),您将自动重新缓存。当 N 分钟过去后,您可以依赖您的支票系统。

如果从cfexecute运行s3cmd,请尝试创建一个更新应用程序范围中的时间戳的脚本,然后将curl命令添加到命中cf脚本的s3cmd脚本中 - 保留2同步过程。

您的另一个选择是不断使用fileExists()(不是一个好主意 - 非常昂贵)或跟踪缓存或未缓存的其他可以实时更新的方式 - 例如DB表。然后,您需要从s3cmd脚本中清除表(可能使用mysql命令行)。

我可能会想到你的其他东西。这就是我现在所拥有的一切。 :)