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

Php 是否会缓存动态创建的JavaScript文件?,php,javascript,caching,dynamic,Php,Javascript,Caching,Dynamic,所以我的应用程序使用了很多js文件。这是很多http请求。我决定在服务器上将它们动态地组合在3-4个文件包中,这些文件由功能组成 我的客户端请求是: …script type=“text/javascript”src=”http://mydomain.com/core-js.php“ 我的服务器端执行以下操作: --core-js.php-- 标题(“内容类型:应用程序/x-javascript”) 包括_once('file1.js'); 包括_once('file2.js'); 包括_on

所以我的应用程序使用了很多js文件。这是很多http请求。我决定在服务器上将它们动态地组合在3-4个文件包中,这些文件由功能组成


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

我的服务器端执行以下操作: --core-js.php-- 标题(“内容类型:应用程序/x-javascript”)

包括_once('file1.js'); 包括_once('file2.js'); 包括_once('file3.js'); 包括_once('file4.js')


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


谢谢

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

客户端不知道或不关心通过将多个文件集中到服务器端发送给它的内容是否令人满意。如果缓存头是正确的,客户端应该缓存它。您需要仔细检查它们,以确保您的PHP安装没有发送其他冲突的标题(Firefox+Firebug很适合这样做),因为PHP页面往往用于不需要缓存的动态内容。

绝大多数浏览器和缓存代理都会尊重过期标题(如果设置).

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

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

另一方面,您应该看看Minify
您可以合并和缓存组中的js和css,基本上就是您正在做的事情。我已经使用了一段时间,没有任何问题,而且非常好。

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

另一方面,您应该看看Minify
您可以合并和缓存组中的js和css,基本上就是您正在做的事情。我已经使用了一段时间,没有任何问题,而且非常好。

是的,但它很复杂。默认情况下,PHP会添加一组阻止缓存的头文件。你必须确保你把它们都移除了。另外,如果修改了
,您的PHP脚本是否理解
;如果没有匹配的
标题,您的PHP脚本是否理解
?您是否首先生成上次修改的
ETag
标题?这是一个棘手的问题,当您的Web服务器内置了所有这些功能时,为什么还要麻烦呢

我会换一种方式。请求
core.js
,而不是
core.php
。当然,
core.js
不存在,因此
.htaccess
捕获请求并将其定向到
index.php
。现在
index.php
生成所需的javascript并将其提供给客户端。它还创建文件
core.js
。将来对
core.js
的请求将由Apache按照静态文件的正常方式处理,而不需要接近PHP

如果您希望能够更新javascript,可以使用
上次修改的timestap.core.js
格式的URL。更改HTML中的时间戳将在第一次请求时生成一个新的javascript文件


我这样做是为了动态创建CSS(设计师可以在管理面板中编辑CSS,并将值保存到数据库中),它工作得很好。

是的,但它很复杂。默认情况下,PHP会添加一组阻止缓存的头文件。你必须确保你把它们都移除了。另外,如果修改了
,您的PHP脚本是否理解
;如果没有匹配的
标题,您的PHP脚本是否理解
?您是否首先生成上次修改的
ETag
标题?这是一个棘手的问题,当您的Web服务器内置了所有这些功能时,为什么还要麻烦呢

我会换一种方式。请求
core.js
,而不是
core.php
。当然,
core.js
不存在,因此
.htaccess
捕获请求并将其定向到
index.php
。现在
index.php
生成所需的javascript并将其提供给客户端。它还创建文件
core.js
。将来对
core.js
的请求将由Apache按照静态文件的正常方式处理,而不需要接近PHP

如果您希望能够更新javascript,可以使用
上次修改的timestap.core.js
格式的URL。更改HTML中的时间戳将在第一次请求时生成一个新的javascript文件

我这样做是为了动态创建CSS(设计师可以在“管理”面板中编辑CSS,并将值保存到数据库中),而且效果很好。

请参见:,您必须检查传入的请求头才能发送正确的响应。 您可以执行以下操作:

<?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;
?>

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

请参见:,您必须检查