2010-03-31 33 views
0

所以我的应用程序使用了大量的js文件。那很多的http请求。我决定将它们动态地在服务器上以功能组合的3-4个文件组合起来。会动态创建JavaScript文件吗?


我的客户端的请求是: ...脚本类型= “文/ 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('file2.js'); include_once('file3.js'); include_once('file3.js'); include_once('file4.js'); include_once('file4.js');


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

谢谢!

+0

你想让它们缓存吗?请问core.js.php总是返回相同的javascript,还是根据页面的需要动态组装? – Rob 2010-03-31 15:24:21

+0

我想让他们缓存。它每次都是相同的文件集合。 – venksster 2010-04-05 15:30:33

回答

3

客户端不知道或不关心什么被罚到它是由若干个文件汇集服务器端满足。如果缓存标头是正确的,客户端应缓存它。您需要仔细检查它们以确保您的PHP安装不会发送其他冲突的头文件(Firefox + Firebug适用于此),因为PHP页面倾向于用于不想缓存的动态内容。

0

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

0

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

在另一个说明中,你应该看看Minify http://code.google.com/p/minify/ 你可以合并和缓存不仅js,而且css分组,基本上你在做什么。我一直在使用它一段时间没有问题,这很不错。

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,并将值保存到数据库中),并且效果很好。

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和修改时间以在包含和计算之前执行检查。或者检查文件大小而不是包含。