Ich habe ein Problem mit der PHP-Dateizeitfunktion. In meiner Webapp verwende ich Smarty Template Engine mit Caching Option. In meiner Webapp kann ich einige Aktionen ausführen, die Fehler erzeugen, aber wir können uns auf nur eine Aktion konzentrieren. Wenn ich auf Link auf der Seite klicke, werden einige Inhalte aktualisiert - ich kann einige Male klicken und alles ist in Ordnung, aber über eine Anfrage auf 10 schlägt fehl. Folgender Fehler tritt auf:
%Vor%und die Zeile, die das Problem verursacht:
%Vor%Wie Sie sehen, existiert die Datei, weil sie markiert ist.
Problematische Codezeile ist in smarty_internal_cacheresource_file.php
(Teil von Smarty lib v3.0.6) enthalten.
App wird auf einem UNIX-System, externem Hosting, ausgeführt.
Irgendwelche Ideen? Soll ich mehr Details veröffentlichen?
file_exists
verwendet intern die access
Systemaufruf, der Berechtigungen als real Benutzer überprüft, während filemtime
stat
, die die Überprüfung als effektiver Benutzer durchführt. Daher kann das Problem in der Annahme eines effektiven Benutzers == echter Benutzer begründet sein, der nicht gilt. Eine andere Erklärung wäre, dass die Datei zwischen den beiden Aufrufen gelöscht wird.
Da sich sowohl das Ergebnis von $_template->getCachedFilepath()
als auch das Vorhandensein der Datei zwischen Systemaufrufen ändern kann, warum rufen Sie file_exists
überhaupt auf? Stattdessen würde ich nur vorschlagen,
Wenn $_template->getCachedFilepath()
auf einen Dummy-Wert wie false
gesetzt werden kann, verwenden Sie Folgendes:
Ich habe filemtime erfolgreich benutzt, ohne "file_exists" seit Jahren zu überprüfen. Die Art und Weise, wie ich die Dokumentation immer interpretiert habe, ist, dass FALSE bei irgendeinem Fehler von "filemtime" zurückgegeben werden sollte. Dann ist vor ein paar Tagen etwas sehr Seltsames passiert. Wenn die Datei nicht vorhanden war, wurde mein Cron-Job mit einem Ergebnis beendet. Das Ergebnis lag nicht in der Programmausgabe, sondern in der Cron-Ausgabe. Die Nachricht war "Dateilänge überschritten". Ich wusste, dass der Cron-Job auf der filemtime-Anweisung endete, weil ich mir vor und nach dieser Aussage eine E-Mail geschickt habe. Die "Nachher" -E-Mail ist nie angekommen.
Ich habe eine file_exists-Prüfung in die Datei eingefügt, um den Cron-Job zu reparieren. Dies hätte jedoch nicht notwendig sein sollen. Ich weiß immer noch nicht, was auf dem Hosting-Server geändert wurde, den ich verwende. Mehrere andere Cron-Jobs begannen am selben Tag zu scheitern. Ich weiß noch nicht, ob sie etwas mit Dateizeit zu tun haben.