2011-08-19 8 views
8

Tengo un problema con PHP filemtime function. En mi aplicación web utilizo el motor de plantillas Smarty con la opción de almacenamiento en caché. En mi aplicación web puedo hacer algunas acciones que generan errores, pero nos enfocamos en una sola acción. Cuando hago clic en el enlace en la página, se actualiza el contenido; puedo hacer clic varias veces y todo está bien, pero una de las 10 solicitudes falla. Produce el error siguiente:PHP filemtime function - "error de stat para"

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

y la línea que causa el problema:

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

Como se puede ver, existe archivo porque está marcada.

línea de código problemática está incluido en smarty_internal_cacheresource_file.php (parte de Smarty v3.0.6 lib)

aplicación se ejecuta en el sistema UNIX, hospedaje externo.

¿Alguna idea? ¿Debo publicar más detalles?

+0

Sólo una nota: se puede leer el directorio padre? –

+0

sí, es legible – lbednaszynski

Respuesta

10

file_exists internamente utiliza la llamada access sistema que comprueba los permisos como el verdadero usuario , mientras que filemtime utiliza stat, que realiza el cheque como la efectiva usuario . Por lo tanto, el problema puede estar arraigado en la suposición de usuario efectivo == usuario real, que no se cumple. Otra explicación sería que el archivo se elimina entre las dos llamadas.

Dado que tanto el resultado de $_template->getCachedFilepath() como la existencia del archivo pueden cambiar entre llamadas al sistema, ¿por qué llama al file_exists? En su lugar, me gustaría sugerir simplemente

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

Si $_template->getCachedFilepath() se puede ajustar a un valor artificial como por ejemplo false, utilice la siguiente:

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

Entiendo que el archivo puede desaparecer entre dos llamadas, pero solo soy uno que prueba esta aplicación. También lo pruebo solo para un usuario, por eso es extraño para mí. Puedo ignorar el error al poner @ sign, pero el problema no desaparecerá. – lbednaszynski

+1

No me gustan las soluciones que incluyen supresión de errores, pero +1 para la nota efectiva/real. @marchewa comprueba los permisos de los archivos. –

+0

Los permisos de todos los archivos en caché son 0644 (rw-r - r--). Mis scripts crean, eliminan e intentan leer estos archivos. Como dije, solo el 10% de las solicitudes falla. – lbednaszynski

0

he usado con éxito filemtime sin comprobar "file_exists" durante años. La forma en que siempre he interpretado la documentación es que FALSE debe devolverse desde "filemtime" ante cualquier error. Luego, hace unos días, ocurrió algo muy extraño. Si el archivo no existía, mi trabajo de Cron terminó con un resultado. El resultado no estaba en la salida del programa sino en la salida de Cron. El mensaje fue "excedida la longitud del archivo". Sabía que el trabajo de Cron finalizaba en la declaración de FileMtime porque me envié un correo electrónico antes y después de esa declaración. El correo electrónico "después" nunca llegó.

He insertado una comprobación file_exists en el archivo para corregir el trabajo de Cron. Sin embargo, eso no debería haber sido necesario. Todavía no sé qué cambió en el servidor de alojamiento que uso. Varios otros trabajos de Cron comenzaron a fallar el mismo día. Todavía no sé si tienen algo que ver con FileMtime.

Cuestiones relacionadas