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

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

WBOY
풀어 주다: 2016-10-11 14:23:31
원래의
1554명이 탐색했습니다.

  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 요청을 줄이고 동시성으로 인한 연결 해제 위험을 줄입니다. (이유를 생각해 보세요.)

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

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

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

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿