【发布时间】:2014-12-01 10:54:18
【问题描述】:
我在 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) !!!
【问题讨论】:
-
可能是因为S3返回xml结果。 ColdFusion 甚至返回所有返回非 404 结果的 url。我认为这就是你认为它是真实的原因。
-
@PriteshPatel 我不这么认为,因为当我使用 fileDelete('roger') 删除文件时,fileExists('roger') 会按预期返回 false。这有点像 CF “缓存”目录中的文件列表,当它们被 s3cmd 等外部服务删除时不会刷新它
-
我觉得我读得太快了:(
-
Xevi - 我认为您的问题是延迟。如果您等待的时间足够长 - 说几分钟。这个问题是否持续存在? CF 目录列表最终会反映已删除的文件吗? S3 的幕后发生了很多事情。
-
@MarkAKruger - 是的,我认为在测试过程中的某个时刻,我看到 CF 最终反映了已删除的文件。但是我需要我的应用程序的最新信息...您认为我不应该混合技术并仅使用冷融合或仅使用 s3cmd 进行所有写入/删除/读取操作吗?
标签: amazon-web-services coldfusion amazon-s3 coldfusion-9 s3cmd