2011-12-04 2 views
3

내 워크 플로우를 작동하지 꽤 간단하다PHP : 싶으면 clearstatcache()

  1. 은 내가
  2. clearstatcache()은 내가 전화
  3. 새 파일을 저장 전화
  4. 파일을 삭제 clearstatcache()

아직 끝나면 is_file()은 잠시 동안 false을 반환하고을 반환하기로 결정했습니다.예를 들어 10 초 후에 새로 고침합니다.

캐시 문제처럼 보입니까? 그렇습니다.

여기 내 코드의 일부입니다 :

// step 1 
$path = 'file_to_delete.jpg'; 
unlink($path); 

// is_file($path) returns false here -- normal behavior 
// step 2 
clearstatcache(); 

// step 3 -- some stuff going on on an uploaded image, that leads to: 
imagejpeg($imagetosave, $path, 80); 

// step 4 
clearstatcache(); 

// is_file() returns false, i have to wait a couple of seconds before it starts returning true 

여러분의 도움에 감사드립니다!

편집 :

내가 가진 모든 해답을 감안할 때, 문제가되지 clearstatcache()에서 온 것처럼 보인다.

하지만 파일을 덮어 쓸 때 (따라서 기존 상태가 변경되지 않음) is_file()이 좋은 결과를 반환합니다. 그러나 기존 상태가 실제로 변경되면 문제가 발생합니다. 오류가 clearstatcache()에서 오지 않았다면 이상 할 것입니다. 맞습니까? (또는이 캐시와 관련이있는 것)

+0

첫 번째 단계 이전 위치에서 'is_file()'이 true를 반환합니까? 우리가 실행할 수있는 완전한 샘플을 제공하고 그 문제가 발생하는지 확인하십시오. – zerkms

+3

그 이유는 확실하지 않지만'unstlink'가 자동으로 캐시를 지우므로'clearstatcache'에 대한 첫 번째 호출은 쓸모가 없습니다. – nico

+0

제 생각 엔 당신은 어딘가에 프로그래밍 오류가 있습니다. 문제를 일으키기 위해 스크립트를 최소한으로 단순화하여 디버그에 도움을줍니다. – goat

답변

2

@hakre에 동의합니다. 작성/삭제 결과를 확인하십시오.

는 심지어 라스무스 자신 recommends it, 빠른 - 및 - 더러운 아니다 :

너희들이 생각하는

[2011-03-31 세계 협정시 08시 34분] [email protected] 그 합계 캐시 요청 당 맞지? 만이 A. 이 stat를 수행 한 경우 file_exists() 호출 전에 통계 캐시를 지우고 B. 요청시이를 생성하거나 삭제했습니다. 어떤 경우에는 작성/삭제의 성공 상태가 파일이 인지 여부를 알려주므로 다시 통계를하지 않아야합니다. 아마도 장시간 실행되는 데몬이나 뭔가의 경우이 은 더 많은 문제가되지만 일반적인 웹 요청의 경우 stat 캐시 은 일반적으로 수십 개의 시스템 호출을 저장합니다.

당신이 정말로 clearstatcache()를 사용하여 주장하는 경우, 내 마음에 오는 (쓰기 캐시 제외) 유일한 것은 당신이 파일의 수천을 포함, 매우 업로드 폴더가 MAVE 있다는 것입니다.

하나의 폴더에 많은 파일이 많으면 확실히 다시 말하기 속도가 느려집니다.

그렇다면 통계 성능을 얻기 위해 파일 수를 줄이십시오. 여러 개의 폴더를 만들면 업로드 파일 이름의 각 초기 문자에 대해 하나의 폴더 (예 : upload/a/, upload/b/ 등)를 만들 수 있습니다.

+0

문제는 간단하지만 간단하지만 다른 스크립트를 사용하여 다른 작업 (하나는 삭제, 하나는 생성)이 수행됩니다. Liek, 그리고 PHP doc 상태에서 스크립트가 다르면 캐시 문제가 없어야합니다. e, 그래서'clearstatcache()'로 해결하려고했지만, 문제는 다른 위치, 어쩌면 나의 친애하는 hoster에서 온 것 같다. .. 그리고 마지막 지점에 대답하기 위해, 나는 dev env에서 일하고있다. 몇 가지 파일에, 그래서 문제가 여기에서 온 것 같아요. :) 답변을 주셔서 감사합니다! – Pioul