Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

filemtime "warning stat failed for"

I already read it so many questions and answers about it but I can't still solve my problem...

I'm trying to create a function that deletes all the files with "xml" or "xsl" extension that has been created one day ago. But I'm getting this warning on each file I have:

Warning: filemtime() [function.filemtime]: stat failed for post_1003463425.xml in /home/u188867248/public_html/ampc/library.php on line 44

All the files of this directory have the same structure name "post_ + randomNum + .xml" (example: post_1003463425.xml or post_1456463425.xsl). So I think it's not an encoded problem (like I saw in other questions).

The code of my function is this:

 function deleteOldFiles(){     if ($handle = opendir('./xml')) {         while (false !== ($file = readdir($handle))) {               if(preg_match("/^.*\.(xml|xsl)$/i", $file)){                  $filelastmodified = filemtime($file);                  if ( (time()-$filelastmodified ) > 24*3600){                     unlink($file);                 }             }         }         closedir($handle);      } } 

Thanks for your help :)

like image 710
Gerard Brull Avatar asked Nov 14 '12 19:11

Gerard Brull


2 Answers

I think the problem is the realpath of the file. For example your script is working on './', your file is inside the directory './xml'. So better check if the file exists or not, before you get filemtime or unlink it:

  function deleteOldFiles(){     if ($handle = opendir('./xml')) {         while (false !== ($file = readdir($handle))) {               if(preg_match("/^.*\.(xml|xsl)$/i", $file)){               $fpath = 'xml/'.$file;               if (file_exists($fpath)) {                 $filelastmodified = filemtime($fpath);                  if ( (time() - $filelastmodified ) > 24*3600){                     unlink($fpath);                 }               }             }         }         closedir($handle);      }   } 
like image 53
Somy A Avatar answered Sep 27 '22 22:09

Somy A


For me the filename involved was appended with a querystring, which this function didn't like.

$path = 'path/to/my/file.js?v=2' 

Solution was to chop that off first:

$path = preg_replace('/\?v=[\d]+$/', '', $path); $fileTime = filemtime($path); 
like image 37
Andrew Avatar answered Sep 27 '22 22:09

Andrew