是否会缓存动态创建的JavaScript文件?

时间:2010-03-31 15:18:04

标签: php javascript caching dynamic

所以我的应用程序使用了大量的js文件。这就是很多http请求。我决定在服务器上动态地将它们组合在一起,包含3-4个按功能分组的文件。


我的客户端请求是: ... script type =“text / javascript”src =“http://mydomain.com/core-js.php”......

我的服务器端: --core-js.php-- header(“Content-type:application / x-javascript”);

include_once( 'file1.js'); include_once( 'file2.js'); include_once( 'file3.js'); include_once( 'file4.js');


我在core-js.php上设置了一个远期未来的过期标头。我的问题是,core-js.php会在客户端缓存吗?如果是的话,有人可以解释一下吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

客户端不知道或不关心通过将多个文件服务器端放在一起来满足发送给它的内容。客户端应缓存如果缓存标头正确。您需要仔细检查它们以确保您的PHP安装没有发送其他冲突的标头(Firefox + Firebug对此有利),因为PHP页面往往用于不需要缓存的动态内容

答案 1 :(得分:1)

请参阅:http://www.jonasjohn.de/snippets/php/caching.htm,您必须检查传入的请求标头以发送正确的响应。 您可以执行以下操作:

<?php
ob_start();
$filemtimes = array();
foreach(array('file1.js','file2.js') as $file)
{
include_once($file); 
$filemtimes[]= filemtime($file);
}

$date = gmdate('D, d M Y H:i:s', max($filemtimes)).' GMT';
$length = ob_get_length();
$etag = md5($date.$lengte);

$headers = apache_request_headers();


if(!empty($headers['If-None-Match']) && !empty($headers['If-Modified-Since']))
{

if
(
    $etag == md5($headers['If-Modified-Since'].$length)
)
{

        ob_end_clean();

            header("Content-type: application/x-javascript");
        header('Last-Modified: '.$date."\r\n");
        header('Expires: '.gmdate('D, d M Y H:i:s', (time()+3600)).' GMT'."\r\n");
        header('Cache-Control: max-age=3600'."\r\n");
        header('ETag: '.$headers['If-None-Match']."\r\n");
            header('HTTP/1.1 304 Not Modified');
        header('Connection: close');

        exit;
    }   
}
header("Content-type: application/x-javascript");
header('Last-Modified: '.$date."\r\n");
header('Expires: '.gmdate('D, d M Y H:i:s', (time()+3600)).' GMT'."\r\n");
header('Cache-Control: max-age=3600'."\r\n");
header('ETag: '.$headers['If-None-Match']."\r\n");
header('Content-Length: '.$length."\r\n");
header('Accept-Ranges: bytes'."\r\n");
ob_end_flush();
exit;
?>

您的脚本将被缓存。没有数据发送到客户端。服务器端对每个请求都进行包含和修改计算。也许在会话或cookie中存储etag和修改时间,以便在包含和计算之前进行检查。或者检查文件大小而不是包含。

答案 2 :(得分:0)

绝大多数浏览器和缓存代理都会尊重到期标头(如果已设置)。

答案 3 :(得分:0)

是的,它会。客户端不知道他要求的js文件是一堆其他文件,他只是看到一个js文件,他请求的那个,并告诉他缓存它,core-js.php。只要你不改变文件的名称(core-js.php)就没有问题。

另外请注意,你应该看看Minify http://code.google.com/p/minify/ 你不仅可以合并和缓存js,而且可以在组中缓存css,基本上你正在做什么。我已经使用了一段时间没有任何问题,而且非常好。

答案 4 :(得分:0)

是的,但这很复杂。默认情况下,PHP会添加一堆阻止缓存的标头。你必须确保你删除所有这些。此外,您的PHP脚本是否了解If-Modified-SinceIf-None-Match标题?您是否首先生成Last-ModifiedETag标题?当你的网络服务器内置了所有内容时,为什么要做到这一点很棘手,为什么还要费心呢?

我会这样做。向core.js提出请求,而不是core.php。当然,core.js不存在,因此.htaccess会抓住请求并将其定向到index.php。现在index.php生成所需的javascript并将其提供给客户端。它还会创建文件core.js。对core.js的未来请求将由Apache正常处理静态文件,而不是靠近PHP。

如果您希望能够更新javascript,则可以改为使用last-modified-timestap.core.js形式的网址。更改HTML中的时间戳将在第一次请求时生成新的javascript文件。

我为动态创建的CSS执行此操作(设计人员可以在管理面板中编辑CSS,并将值保存到数据库中),并且运行良好。