2011-08-19 13 views
8

Ho un problema con la funzione filemtime di PHP. Nella mia webapp utilizzo il motore di template Smarty con opzione di caching. Nella mia webapp posso fare alcune azioni che generano errori, ma concentrarsi su una sola azione. Quando faccio clic sul link sulla pagina alcuni contenuti vengono aggiornati: riesco a fare clic poche volte e tutto è OK, ma circa una richiesta su 10 non riesce. A seguito di errore si verifica:Funzione filemtime PHP - "stat failed for"

filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for 

e la linea che causa il problema:

return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ; 

Come si può vedere, il file esiste perché sia ​​selezionata.

riga problematica di codice è incluso nella smarty_internal_cacheresource_file.php (parte di Smarty lib v3.0.6)

App viene eseguito sul sistema UNIX, hosting esterno.

Qualche idea? Devo pubblicare più dettagli?

+0

Solo una nota: è la directory padre leggibile? –

+0

sì è leggibile – lbednaszynski

risposta

10

file_exists utilizza internamente la chiamata di sistema access che controlla i permessi come la vera utente , mentre filemtime utilizza stat, che esegue il controllo come l'effettiva utente . Pertanto, il problema può essere radicato nell'ipotesi di utente effettivo == utente reale, che non regge. Un'altra spiegazione potrebbe essere che il file viene eliminato tra le due chiamate.

Poiché il risultato di $_template->getCachedFilepath() e l'esistenza del file possono cambiare tra chiamate di sistema, perché si chiama file_exists? Invece, io suggerirei appena

return @filemtime($_template->getCachedFilepath()); 

Se $_template->getCachedFilepath() può essere impostato su un valore fittizio, come false, utilizzare il seguente:

$path = $_template->getCachedFilepath(); 
if (!$path) return false; 
return @filemtime($path); 
+0

Capisco che il file può sparire tra due chiamate, ma sono solo uno che testa questa applicazione. Lo provo anche solo per un utente, ecco perché è strano per me. Posso ignorare l'errore inserendo il segno @, ma il problema non scomparirà. – lbednaszynski

+1

Non mi piacciono le soluzioni che includono la soppressione degli errori, ma +1 per la nota effettiva/reale. @ Marchewa controlla le autorizzazioni dei file. –

+0

Le autorizzazioni di tutti i file memorizzati nella cache sono 0644 (rw-r -r--). I miei script creano, eliminano e provano a leggere questi file. Come ho detto, solo il 10% circa delle richieste fallisce. – lbednaszynski

0

ho usato con successo filemtime senza controllare "file_exists" per anni. Il modo in cui ho sempre interpretato la documentazione è che FALSE deve essere restituito da "filemtime" su qualsiasi errore. Poi qualche giorno fa è accaduto qualcosa di molto strano. Se il file non esisteva, il mio lavoro Cron terminava con un risultato. Il risultato non era nell'output del programma, ma piuttosto nell'output di Cron. Il messaggio era "lunghezza del file superata". Sapevo che il lavoro di Cron terminava con la dichiarazione di filemtime perché mi sono inviato una e-mail prima e dopo quella dichiarazione. L'e-mail "dopo" non è mai arrivata.

Ho inserito un controllo file_exists sul file per correggere il processo Cron. Tuttavia, ciò non avrebbe dovuto essere necessario. Non so ancora cosa è stato modificato sul server di hosting che utilizzo. Diversi altri lavori di Cron hanno iniziato a fallire lo stesso giorno. Non so ancora se abbiano qualcosa a che fare con il filemtime.

2

Usa:

Smarty::muteExpectedErrors(); 

Leggi this e this