>  기사  >  백엔드 개발  >  PHP가 파일을 삭제하고 다시 빌드한 후 파일 생성 시간(filectime)이 변경되지 않는 문제를 해결하는 방법은 무엇입니까? ?

PHP가 파일을 삭제하고 다시 빌드한 후 파일 생성 시간(filectime)이 변경되지 않는 문제를 해결하는 방법은 무엇입니까? ?

WBOY
WBOY원래의
2016-10-11 14:23:311489검색

  1. php는 test.html이라는 파일을 생성하고 filectime을 사용하여 생성 시간 t1을 가져옵니다

  2. php는 test.html이라는 파일을 삭제합니다.

  3. php는 test.html이라는 파일을 다시 생성하고 filectime을 사용하여 생성 시간 t2를 가져옵니다

왜 t1 = t2인가요? ? 생성 시간이 업데이트되지 않는 이유는 무엇입니까? ? 파일 상태 캐시를 지우기 위해 Clearstatcache 기능을 사용했는데 작동하지 않습니다. 이 문제를 해결하는 방법은 무엇입니까? ? (캐시파일 재생성 여부 판단시 캐시파일 생성시간을 아는 것이 중요하므로 해결 부탁드립니다~)
이러한 상황에서 발생하는 문제에 대한 코드는 다음과 같습니다(조금 촘촘합니다) , 조금만 기다려주세요) (시아하):

<code>     // 页面缓存
     if ((defined('DEBUG_MODE') && !DEBUG_MODE) && (defined('CACHE_CONTROL') && CACHE_CONTROL)) {
         $opr = $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/' . $GLOBALS['controller'] . '/' . $GLOBALS['act'];
         $cache_name = md5($opr) . TEMPLATE_SUFFIX;
         $cache_file = APP_DIR . '/' . $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/Cache/' . $cache_name;
         // 清除文件状态缓存(就我使用的情况来看,压根没毛用...,这什么情况??)
         clearstatcache();
         // 缓存文件不存在 创建
         if (!$GLOBALS['FOpr']->checkFile($cache_file)) {
            require_once $view_file;
            $GLOBALS['FOpr']->cFile($cache_file);
            $GLOBALS['FOpr']->wData($cache_file , ob_get_contents());
         } else {
            // 超时重新缓存
            if (time() > filectime($cache_file) + CACHE_LIFE_TIME) {
                require_once $view_file;
                // 缓存文件超时时,先删除原缓存文件
                $GLOBALS['FOpr']->dFile($cache_file);
                // 新建同名缓存文件
                //(新建文件时,filectime 获取文件创建时间一直没更新!这个怎么破??
                // 这导致我没法重新生成缓存文件了!)
                $GLOBALS['FOpr']->cFile($cache_file); 
                // 写入缓存
                $GLOBALS['FOpr']->wData($cache_file , ob_get_contents() , 'w');
            } else {
                // 加载缓存文件
                require_once $cache_file;
            }
         }
     } else {
         // 显示动态文件(非缓存)
         require_once $view_file;
     }</code>

답글 내용:

  1. php는 test.html이라는 파일을 생성하고 filectime을 사용하여 생성 시간 t1을 가져옵니다

  2. php는 test.html이라는 파일을 삭제합니다

  3. php는 test.html이라는 파일을 다시 생성하고 filectime을 사용하여 생성 시간 t2를 가져옵니다

왜 t1 = t2인가요? ? 생성 시간이 업데이트되지 않는 이유는 무엇입니까? ? 파일 상태 캐시를 지우기 위해 Clearstatcache 기능을 사용했는데 작동하지 않습니다. 이 문제를 해결하는 방법은 무엇입니까? ? (캐시파일 재생성 여부 판단시 캐시파일 생성시간을 아는 것이 중요하므로 해결 부탁드립니다~)
이러한 상황에서 발생하는 문제에 대한 코드는 다음과 같습니다(조금 촘촘합니다) , 조금만 기다려주세요) (시아하):

<code>     // 页面缓存
     if ((defined('DEBUG_MODE') && !DEBUG_MODE) && (defined('CACHE_CONTROL') && CACHE_CONTROL)) {
         $opr = $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/' . $GLOBALS['controller'] . '/' . $GLOBALS['act'];
         $cache_name = md5($opr) . TEMPLATE_SUFFIX;
         $cache_file = APP_DIR . '/' . $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/Cache/' . $cache_name;
         // 清除文件状态缓存(就我使用的情况来看,压根没毛用...,这什么情况??)
         clearstatcache();
         // 缓存文件不存在 创建
         if (!$GLOBALS['FOpr']->checkFile($cache_file)) {
            require_once $view_file;
            $GLOBALS['FOpr']->cFile($cache_file);
            $GLOBALS['FOpr']->wData($cache_file , ob_get_contents());
         } else {
            // 超时重新缓存
            if (time() > filectime($cache_file) + CACHE_LIFE_TIME) {
                require_once $view_file;
                // 缓存文件超时时,先删除原缓存文件
                $GLOBALS['FOpr']->dFile($cache_file);
                // 新建同名缓存文件
                //(新建文件时,filectime 获取文件创建时间一直没更新!这个怎么破??
                // 这导致我没法重新生成缓存文件了!)
                $GLOBALS['FOpr']->cFile($cache_file); 
                // 写入缓存
                $GLOBALS['FOpr']->wData($cache_file , ob_get_contents() , 'w');
            } else {
                // 加载缓存文件
                require_once $cache_file;
            }
         }
     } else {
         // 显示动态文件(非缓存)
         require_once $view_file;
     }</code>

응용 시나리오 측면에서:

  • filemtime은 캐시의 시간 초과 판단 논리를 더 잘 완성할 수 있습니다.

  • 다시 쓴 후에는 filemtime이 변경되므로 파일을 삭제할 필요가 없습니다.

  • 파일을 삭제한 이유가 있을 텐데, 답변 아래 '주제 외' 항목을 참고해주세요

PHP에서 파일을 삭제하고 생성하는 것에 대하여

저자는 다음 코드를 사용하여 실험을 했습니다

<code>$path = __DIR__.'/test.txt';

file_put_contents($path, 'content1');
echo filectime($path),PHP_EOL;

unlink($path);
sleep(2);

file_put_contents($path, 'content2');
echo filectime($path),PHP_EOL;</code>

결과:

창(windows 10 x64)

반납 시간은 두 번째로 실행해도 처음과 동일합니다.
근데 txt가 2초 동안 사라졌다가 다시 생성되는 걸 봤어요. 이것은 Windows에서 이러한 논리를 가질 수 있습니다(자세히 연구되지 않음). 그림에 표시된 것처럼 두 번째 실행 후 얻은 파일 속성은 다음과 같습니다.

PHP가 파일을 삭제하고 다시 빌드한 후 파일 생성 시간(filectime)이 변경되지 않는 문제를 해결하는 방법은 무엇입니까? ?

Linux 기반 CentOS

반납시간

으로 변경됩니다.

주제에서 벗어남

내가 작성했거나 본 일부 파일 캐시 엔진에서는 읽기 캐시 작업이 시간 초과가 감지되더라도 캐시 파일을 삭제하지 않습니다.

  • 이건 게으름이 아니고 결국 연결 해제는 쉽습니다

  • 대신 필요한 I/O 요청을 줄이고 동시성으로 인한 연결 해제 위험을 줄입니다. (이유를 생각해 보세요.)

  • 게다가 관성적 사고에 따르면 이 캐시에 접근하고 있기 때문에 이 캐시는 반드시 덮어쓰게 될 것이므로 삭제 후 다시 빌드하는 것은 별 의미가 없습니다

  • 유일한 문제는 디스크 공간 점유입니다. 예를 들어 오랫동안 액세스하지 않은 일부 캐시는 여전히 공간을 차지합니다. 이러한 상황에 대해서는 일반적으로 허용하거나 코드를 직접 구현하여 사용합니다. 예약된 작업 삭제

  • 똑똑하게 컴파일된 파일은 귀하의 시나리오와 유사합니다. 그의 접근 방식은 다음과 같습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.