Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann das Problem gelöst werden, dass sich die Dateierstellungszeit (filectime) nicht ändert, nachdem PHP die Datei löscht und neu erstellt? ?

Wie kann das Problem gelöst werden, dass sich die Dateierstellungszeit (filectime) nicht ändert, nachdem PHP die Datei löscht und neu erstellt? ?

WBOY
WBOYOriginal
2016-10-11 14:23:311530Durchsuche

  1. php erstellt eine Datei mit dem Namen test.html und verwendet filectime, um die Erstellungszeit t1 abzurufen

  2. php löscht die Datei namens test.html

  3. php erstellt die Datei namens test.html neu und verwendet filectime, um die Erstellungszeit t2 zu ermitteln

Warum t1 = t2? ? Warum wird die Erstellungszeit nicht aktualisiert? ? Ich habe die Funktion „clearstatcache“ verwendet, um den Dateistatus-Cache zu löschen, aber es hat nicht funktioniert. Wie kann ich dieses Problem lösen? ? (Da es wichtig ist, die Erstellungszeit der Cache-Datei zu kennen, um zu beurteilen, ob die Cache-Datei neu generiert werden soll, lösen Sie sie bitte ~)
Das Folgende ist der Code für das Problem, das in dieser Situation auftritt (es ist etwas dicht , bitte haben Sie etwas Geduld) (Xiaha):

<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>

Antwortinhalt:

  1. php erstellt eine Datei mit dem Namen test.html und verwendet filectime, um die Erstellungszeit t1 abzurufen

  2. php löscht die Datei namens test.html

  3. php erstellt die Datei namens test.html neu und verwendet filectime, um die Erstellungszeit t2 zu ermitteln

Warum t1 = t2? ? Warum wird die Erstellungszeit nicht aktualisiert? ? Ich habe die Funktion „clearstatcache“ verwendet, um den Dateistatus-Cache zu löschen, aber es hat nicht funktioniert. Wie kann ich dieses Problem lösen? ? (Da es wichtig ist, die Erstellungszeit der Cache-Datei zu kennen, um zu beurteilen, ob die Cache-Datei neu generiert werden soll, lösen Sie sie bitte ~)
Das Folgende ist der Code für das Problem, das in dieser Situation auftritt (es ist etwas dicht , bitte haben Sie etwas Geduld) (Xiaha):

<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>

In Bezug auf Ihr Anwendungsszenario:

  • filemtime kann die Cache-Timeout-Beurteilungslogik besser vervollständigen

  • Die Datei muss nicht gelöscht werden, da sich die Dateizeit nach dem Neuschreiben ändert;

  • Es muss einen Grund geben, warum Sie die Datei gelöscht haben, aber sehen Sie sich bitte das „Off-Topic“ unter der Antwort an
  • In Bezug auf das Löschen und Erstellen von Dateien in PHP

Der Autor hat ein Experiment mit dem folgenden Code durchgeführt

Ergebnis:
<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 (Windows 10 x64)

Die Rückkehrzeit ist tatsächlich die gleiche. Wenn ich es zum zweiten Mal ausführe, ist die Zeit immer noch dieselbe wie beim ersten Mal.

Aber ich habe gesehen, dass der TXT für 2 Sekunden verschwand und dann erneut generiert wurde. Dies kann unter Windows eine solche Logik haben (nicht im Detail untersucht), wie im Bild gezeigt, ist das Dateiattribut, das ich nach der zweiten Ausführung erhalten habe:


Wie kann das Problem gelöst werden, dass sich die Dateierstellungszeit (filectime) nicht ändert, nachdem PHP die Datei löscht und neu erstellt? ?CentOS unter Linux

Die Rückkehrzeit

ändert sich zu

Off-Topic

In einigen Datei-Cache-Engines, die ich geschrieben oder gesehen habe,
löscht der Lese-Cache-Vorgang die Cache-Datei nicht, auch wenn eine Zeitüberschreitung erkannt wird

.

    Ich bin hier nicht faul, schließlich ist es einfach, die Verknüpfung aufzuheben
  • Stattdessen werden die notwendigen E/A-Anfragen und das Risiko einer durch
  • Parallelität verursachten Verbindungstrennung reduziert (

    Überlegen Sie, warum?)

  • Außerdem wird dieser Cache laut Trägheitsdenken definitiv überschrieben, da Sie auf diesen Cache zugreifen, sodass es nicht viel Sinn macht, ihn nach dem Löschen neu zu erstellen
  • Das einzige Problem ist die Speicherplatzbelegung. Beispielsweise belegen einige Caches, auf die über einen längeren Zeitraum nicht zugegriffen wurde, immer noch Speicherplatz. In dieser Situation entscheiden wir uns im Allgemeinen dafür, dies zu tolerieren oder den Code selbst zu implementieren und zu verwenden geplante Aufgaben, um es zu löschen
  • Die von Smarty kompilierte Datei ähnelt Ihrem Szenario: Nicht löschen
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn