2010-03-31 78 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和修改時間以在包含和計算之前執行檢查。或者檢查文件大小而不是包含。