[英]Would dynamically created JavaScript files be cached?
所以我的應用程序使用了很多js文件。 這就是很多http請求。 我決定在服務器上動態地將它們組合在一起,包含3-4個按功能分組的文件。
我的客戶端請求是:...腳本類型=“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會在客戶端緩存嗎? 如果是的話,有人可以解釋一下嗎?
謝謝!
客戶端不知道或不關心通過將多個文件服務器端放在一起來滿足發送給它的內容。 如果緩存標頭正確,客戶端應該緩存它。 您需要仔細檢查它們以確保您的PHP安裝沒有發送其他沖突的標頭(Firefox + Firebug對此有利),因為PHP頁面往往用於不需要緩存的動態內容。
請參閱: 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和修改時間,以便在包含和計算之前進行檢查。 或者檢查文件大小而不是包含。
是的,但它很復雜。 默認情況下,PHP會添加一堆阻止緩存的標頭。 你必須確保你刪除所有這些。 此外,您的PHP腳本是否了解If-Modified-Since
和If-None-Match
標頭? 您是否首先生成Last-Modified
和ETag
標頭? 當你的網絡服務器內置了所有內容時,為什么這么做是很棘手的?
我會以不同的方式做到這一點。 向core.js
發出請求,而不是core.php
。 當然, core.js
不存在,因此.htaccess
捕獲請求並將其定向到index.php
。 現在index.php
生成所需的javascript並將其提供給客戶端。 它還會創建core.js
文件。 對於靜態文件,未來對core.js
請求將由Apache處理,而不需要靠近PHP。
如果您希望能夠更新javascript,則可以使用last-modified-timestap.core.js
形式的URL。 更改HTML中的時間戳將在第一個請求時生成新的javascript文件。
我這樣做是為了動態創建CSS(設計人員可以在管理面板中編輯CSS,將值保存到數據庫中),並且效果很好。
絕大多數瀏覽器和緩存代理都會尊重到期標頭(如果設置)。
是的,它會的。 客戶端不知道他要求的js文件是一堆其他文件,他只是看到一個js文件,他請求的那個,並告訴他緩存它,core-js.php。 只要你不更改文件的名稱(core-js.php)就應該沒有問題。
另外請注意,您應該看一下Minify http://code.google.com/p/minify/您可以合並和緩存不僅僅是js而是緩存css,基本上你正在做什么。 我已經使用它一段時間沒有任何問題,這是非常好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.