3

Amazon S3에 캐시 된 정보를 저장하는 ColdFusion 9에서 사이트를 실행하고 있습니다.Amazon S3 - 파일이 s3cmd에 의해 삭제되면 ColdFusion의 fileExists가 깨집니다.

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'); 

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

+0

S3 return xml result. ColdFusion은 404가 아닌 결과를 반환하는 모든 url에 대해서도 반환합니다. 이것이 사실이라고 생각하는 이유입니다. –

+0

@PriteshPatel fileDelete ('roger')를 사용하여 파일을 삭제하면 fileExists ('roger')가 false를 반환하기 때문에 그렇게 생각하지 않습니다. 그것은 오히려 뭔가 CF와 같은 디렉토리에있는 파일의 목록을 캐싱, 그리고 그들이 s3cmd와 같은 외부 서비스에 의해 삭제되면 새로 고치지 않아요 –

+0

내가 너무 빨리 읽은 것 같아요 : ( –

답변

2

@MarkAKruger의 의견에 동의합니다. 여기서 문제는 대기 시간입니다.

파일이 있는지 여부를 지속적으로 확인할 수는 없지만 최신 내용을 일관되게 읽습니다 (사용할 수없는 경우 일관되게 읽지 못하는 경우). 솔루션 :

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

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

    return strContent; 
} 
+0

예! try catch는 항상 작동합니다. 즉, 던져진 오류에 의존하는 _ 의도적으로 _ 기억해야합니다. 특히 파일 읽기와 관련된 오류는 리소스 측면에서 상당히 비쌉니다. 확장성에 주목하십시오.) –

1

이 대답은 내가 위의 의견 주장대로 대기 시간이 문제입니다 가정합니다.

언제 s3cmd가 실행되는지 추적 할 것입니다. CFEXECUTE를 통해이를 실행하는 경우 응용 프로그램 | 위 또는 파일 또는 DB 테이블에 시간 소인을 저장하십시오. 그런 다음 명령이 마지막으로 N 분에 실행 된 경우 파일을 검사 할 때 (어떤 의미가 있는지 알아 내기 위해 실험해야 함) 자동으로 재 캐시합니다. N 분이 경과하면 신뢰할 수있는 시스템으로 신뢰를받을 수 있습니다.

당신이 cfexecute에서 하지 실행 s3cmd 경우, 응용 프로그램의 범위에 타임 스탬프를 업데이트하는 스크립트를 만들어보십시오 다음 CF 스크립트를 명중 당신의 s3cmd 스크립트에 컬 명령을 추가 - 동기화에서이 개 프로세스를 유지.

다른 옵션은 지속적으로 fileExists()를 사용하는 것입니다 (매우 좋지 않음 - 매우 비쌉니다). 또는 실시간으로 업데이트 할 수있는 다른 방법으로 캐싱되거나 캐싱되지 않은 것을 추적하는 것입니다 (예 : DB 테이블). 그런 다음 s3cmd 스크립트에서 테이블을 지울 필요가 있습니다 (아마도 mysql 명령 줄을 사용하여).

나는 당신을 위해 뭔가를 생각할 수도 있습니다. 그게 내가 가진 전부 야. :)

+0

고마워요.하지만 일관성있는 코드를 찾을 수 없었습니다. 신뢰할 수있는 N 분 ... 신뢰할 수있는 별도의 답변으로 내 솔루션 게시 –