2010-03-31 5 views
0

그래서 내 응용 프로그램은 많은 js 파일을 사용합니다. HTTP 요청이 많습니다. 필자는 서버에서 3-4 개의 파일을 동적으로 결합하기로 결정했습니다.동적으로 생성 된 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가 클라이언트 측에서 캐시 될까? 그렇다면 어떻게 설명 할 수 있겠습니까?

감사합니다.

+0

캐시에 저장 하시겠습니까? core.js.php는 항상 동일한 자바 스크립트를 반환합니까, 아니면 페이지의 필요에 따라 동적으로 어셈블됩니까? – Rob

+0

나는 그들을 캐싱하고 싶습니다. 매번 같은 파일 모음이됩니다. – venksster

답변

3

클라이언트는 서버 측에서 여러 파일을 함께 가져와 클라이언트로 전송 된 내용을 알지 못하거나주의를 기울이지 않습니다. 캐싱 헤더가 올바른 경우 인 경우 클라이언트는 을 캐시해야합니다. PHP 페이지는 캐싱을 원하지 않는 동적 인 것들에 사용되는 경향이 있기 때문에 PHP 설치가 충돌하는 다른 헤더를 보내지 않도록주의 깊게 확인하고 싶을 것입니다 (Firefox + Firebug가 좋습니다). .

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은 필요한 자바 스크립트를 생성하여 클라이언트에게 제공합니다. 또한 core.js 파일을 생성합니다. core.js에 대한 향후 요청은 Apache가 정적 파일을 처리 할 때 PHP와 관련없이 처리됩니다.

그리고 자바 스크립트를 업데이트하려면 대신 last-modified-timestap.core.js 형태의 URL을 사용할 수 있습니다. 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; 
?> 

스크립트가 캐시됩니다. 클라이언트에 보낼 데이터가 없습니다. 서버 측에서는 모든 요청에 ​​대해 포함 및 수정 계산을 수행합니다. 포함 및 계산 전에 점검을 수행하기 위해 세션 또는 쿠키에 etag 및 수정 시간을 저장할 수 있습니다. 또는 includes 대신 filesizes를 확인하십시오.

관련 문제