PHP filemtime Funktion "stat failed for"
Ich habe ein problem mit PHP filemtime Funktion. In meiner webapp nutze ich Smarty template-engine mit caching-option. In meiner webapp kann ich tun einige Aktionen, die Fehler generieren, aber läßt sich auf nur eine Aktion. Wenn ich auf den link auf der Seite einige Inhalte aktualisiert werden - ich kann Sie paar mal und alles ist OK, aber über eine Anfrage auf 10 schlägt fehl. Folgender Fehler tritt auf:
filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for
und die Zeile, die das problem verursacht:
return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ;
Wie Sie sehen können, die Datei existiert, weil es geprüft wird.
Problematische code-Zeile enthalten ist, in smarty_internal_cacheresource_file.php
(Teil Smarty-lib v3.0.6)
App läuft auf UNIX-system, externe hosting.
Irgendwelche Ideen? Ich sollte post mehr Informationen?
- Nur eine Anmerkung: das übergeordnete Verzeichnis, lesbar?
- ja, es ist lesbar
Du musst angemeldet sein, um einen Kommentar abzugeben.
file_exists
intern verwendet dieaccess
system aufrufen, die prüft Berechtigungen des real Benutzer, in der Erwägung, dassfilemtime
verwendetstat
, die führt die überprüfung als effektive Benutzer. Daher kann das problem wurzelt in der Annahme der effektiven Benutzer - = = echter Benutzer, die nicht halten. Eine andere Erklärung wäre, dass die Datei gelöscht wird, die zwischen den beiden anrufen.Da sowohl das Ergebnis der
$_template->getCachedFilepath()
und die Existenz der Datei ändern können, zwischen system fordert, warum nennst dufile_exists
überhaupt? Stattdessen würde ich einfach vorschlagenWenn
$_template->getCachedFilepath()
kann eingestellt werden, um einen dummy-Wert wiefalse
verwenden Sie die folgende:file_exists
, aber vorfilemtime
. Können Sie das problem reproduzieren mit zwei Aufrufefilemtime
d.h. mit(@filemtime(..) !== false)
stattfile_exists
?filemtime
gibt immerE_WARNING
. Ich nehme an, Sie sind Recht von Anfang an. Früher in meinem Skript rufe ichclearCache
Smarty-Funktion, die verwendetunlink
Funktion Datei löschen. Wenn ich diese Zeile auskommentieren problem verschwindet, sonst problem nach dem Zufallsprinzip erfolgt. Frage: ist es möglich, dass die Datei physisch gelöscht, nach einiger Zeit der Aufrufunlink
Funktion?unlink
und dann einfilemtime
aufrufen, wird die Datei nicht da sein. Beachten Sie die mehrere gleichzeitige Prozesse sind die Regel, nicht die Ausnahme auf einem webserver. Sie sollten gehen mit meiner ursprünglichen Antwort - nur calfilemtime
einmal, und legen Sie eine@
an der front zu unterdrücken die Warnung.Verwenden:
Lesen diese und diese
Ich verwendet, filemtime erfolgreich ohne Prüfung "file_exists" für die Jahre. Die Art und Weise habe ich immer interpretiert, die Dokumentation ist, dass FALSE zurückgegeben werden sollte, von "filemtime" bei jedem Fehler. Dann vor ein paar Tagen etwas sehr komisch vorgekommen. Wenn die Datei nicht vorhanden, mein Cron-job beendet mit einem Ergebnis. Das Ergebnis war nicht in der Ausgabe des Programms, sondern vielmehr in der Cron-Ausgabe. War die Meldung "file length exceeded". Ich wusste, dass der Cron-job endete auf dem filemtime Aussage, denn ich schickte mir eine E-Mail vor und nach dieser Aussage. Die "nach" - E-Mail nie angekommen.
Ich eingefügt file_exists überprüfen Sie auf der Datei zu beheben, der Cron-job. Das sollte jedoch nicht nötig gewesen. Ich weiß noch nicht, was geändert wurde auf dem hosting-server, den ich verwenden. Mehrere andere Cron-jobs gestartet, andernfalls am gleichen Tag. Ich weiß noch nicht, ob Sie haben nichts zu tun mit filemtime.