Making the test for some strange flash cache behaviour I’ve learned some useful tips:
You can be sure a movie will be loaded appending a query string to the file name:
[as] loadMovie(“clip.swf?123”, target);[/as]
You can force the user to reload a movie when you release a new version:
[as] clipname= “cache”+VERSION+”-clip.swf”;loadMovie(clipname, target); //Loaded
//After the first load the movie is cached:
loadMovie(clipname, target2); //Cached
[/as] And use a .htaccess file (ModRewrite required):
[apache] RewriteEngine on
RewriteCond %{REQUEST_URI} cache([0-9]+)-(.*).swf(.*)$
RewriteRule ^cache([0-9]+)-(.*).swf(.*)$ $2.swf [L] [/apache]
Only when you change the VERSION
variable (pass it with flashVars) the movie will be reload, otherwise it will be loaded from the browser cache.
You can make cacheable a file downloaded through php:
header('Last-Modified: '.date( "D, j M Y G:i:s GMT", filemtime($filename) ));
Be sure to set the correct content type:
$filename= "clip.swf"; $fp = @fopen($filename,"r"); if($fp){ header('Last-Modified: '.date( "D, j M Y G:i:s GMT", filemtime($filename) )); header('Content-Length: '.filesize($filename)); header('Connection: close'); header('Content-Type: application/x-shockwave-flash'); while (!feof($fp)){ echo(fgets($fp, 4096)); ob_flush(); } fclose($fp); } else { header("HTTP/1.0 404 Not Found"); }
Without Last-Modified or ETag headers flash doesn’t cache the files.