Search code examples
phpcachingfile-exists

Php file exists return same image


This is what I am doing check if file exists and echo in the page, but page shows the old image even when it's already replaced by another image it just shows the old one, but the new image is there and the old one was replaced by the new image with the same name.

<?php 

$dir = 'up/images/'.$_SESSION ['username'].'.png';

if (file_exists($dir)) {
    //echo "ok";
  echo '<img  src="up/images/'.$_SESSION['username'].'.png" class="img-responsive img-thumbnail" width="200px;" height="200px;">'; 

} else {
   //not found 

  echo '<img  src="img/user-icon-yellow.png" class="img-responsive img-thumbnail" width="200px;" height="200px;">'; 
}


?>

It looks like a cache problem or something.


Solution

  • A good way to cache bust would be to add version strings to your image paths. For example:

    $image = basename($_SESSION['username']) . ".png";
    $image = realpath("/path/to/$image");
    echo '<img src="up/images/'.$_SESSION['username'].'.png?v='.filemtime($image).'" [...]>';
    

    This is assuming your HTML pages aren't being cached, if they are, then you'll need to send additional headers to bust the cache. This varies, depending on the environment, but for something like Apache you could do the following:

     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    

    Or, alternatively, you could use PHP's header() function to set the headers:

     header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate");
     header("Pragma: no-cache");
     header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");