我正在ColdFusion 9上运行一个站点,该站点将缓存的信息存储在Amazon S3上。
ColdFusion应用程序构建文件并将它们放入Amazon S3。每隔N
小时,缓存会被执行s3cmd del
的bash脚本刷新,因为它比ColdFusion的fileDelete
或directoryDelete
更有效。
但是,在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' );
// 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' );
// 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' );
// 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) !!!
答案 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命令行)。
我可能会想到你的其他东西。这就是我现在所拥有的一切。 :)