2010-03-06 5 views
1

간단한 PHP 코드 (zend 프레임 워크)를 사용하여 jpg 이미지의 크기를 즉시 조정합니다.동적 크기 조정 이미지 캐시

문제는 항상 HTTP 200 상태로 끝나며 대신 304가 있어야 브라우저가 이미지를 캐시 할 수 있습니다.

나는 아파치 헤더를 얻을 어차피, function_exists('apache_request_headers')은 거짓이며, 서버 변수에 나는

$lastModified = filemtime($path); 
    $etag = md5_file($path); 

    $this->getResponse()->setHeader('Content-type', 'image/jpeg'); 
    $this->getResponse()->setHeader('Cache-Control', 'public'); 
    $this->getResponse()->setHeader('Last-Modified', gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 
    $this->getResponse()->setHeader('Cache-Control', 'max-age=86400, must-revalidate'); 
    $this->getResponse()->setHeader('Expires', gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT'); 
    $this->getResponse()->setHeader('ETag', $etag); 

을 보내고있다에만

'HTTP_ACCEPT' => 'image/png,image/*;q=0.8,*/*;q=0.5', 
    'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 
    'HTTP_ACCEPT_ENCODING' => 'gzip,deflate', 
    'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', 
    'HTTP_CACHE_CONTROL' => 'max-age=0', 
    'HTTP_CONNECTION' => 'keep-alive', 
    'HTTP_COOKIE' => '***', 
    'HTTP_HOST' => 'automobi.li', 
    'HTTP_KEEP_ALIVE' => '300', 
    'HTTP_REFERER' => 'http://automobi.li/oglas/Opel+Astra/2', 
    'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 FirePHP/0.4', 

을하고 난 HTTP_IF_MODIFIED_SINCE 또는 서버 변수 그래서에서 STH 유사한 예상 할 수있다

if ($this->getRequest()->getHeader('IF_MODIFIED_SINCE') == $lastModified) { 
$this->getResponse()->setHttpResponseCode(304); 

    } else { 
    $w = (int) $this->_getParam('w'); 
    $h = (int) $this->_getParam('h'); 
    $image->resize($path, $w, $h); 
    } 

어떤 생각?

답변

0

마지막 수정일If-Modified-Since 값이 동일하지 않은 것으로 비교되지 않습니다. 둘 다 시대를 대표합니다. 그리고 마지막으로 수정 시간보다 큰 경우 변경 한 경우 --때문에 시간 (그래서 마지막으로 수정 한 수정 된 경우 --때문에후 시간이 걸렸), 조건이 충족되고 (304)를 전송한다.

그래서 당신은 구문 분석하는 데 필요한 값 (strtotime 시도) 때문에 수정 한 경우-과 마지막으로 수정 시간보다 큰 경우 값을 비교하려면 변경 한 경우 --때문에 시간 :

if ($lastModified > strtotime($this->getRequest()->getHeader('IF_MODIFIED_SINCE'))) { 
    $this->getResponse()->setHttpResponseCode(304); 
} 
+0

감사합니다 detaiils 걱정. $ _SERVER 변수를 보면, IF_MODIFIED_SINCE가 설정되어 있지 않다는 것을 알 수 있습니다. 이미 작성 했으므로 apache_request_headers 함수가 정의되지 않았으며 이것이 주된 문제입니다.이 데이터가 없습니다! 그래서 해결책을 찾고, 그것을 결정하는 방법. – auto

+0

'$ _SERVER [ 'IF_MODIFIED_SINCE']'가 설정되어 있지 않으면, 클라이언트는 * If-Modified-Since * 헤더 필드를 전송하지 않았으므로이를 사용하여 클라이언트의 표현이 여전히 신선한지를 판별 할 수 없습니다. – Gumbo

+0

대신 사용할 것은 무엇입니까? 클라이언트 캐시를 결정하는 방법이 있어야합니다. – auto

0

http://dustint.com/archives/25

$this->getResponse()->setHeader('Content-type', 'image/jpeg'); 
    $this->getResponse()->setHeader('Expires', '', true); 
    $this->getResponse()->setHeader('Cache-Control', 'public', true); 
    $this->getResponse()->setHeader('Cache-Control', 'max-age=3800'); 
    $this->getResponse()->setHeader('Pragma', '', true); 
    $this->getResponse()->setHeader('ETag', $etag); 

    if ($etag == $this->getRequest()->getHeader('If-None-Match')) { 
     $this->getResponse()->setHttpResponseCode(304); 
    } else { 
     $w = (int) $this->_getParam('w'); 
     $h = (int) $this->_getParam('h'); 
     $image->resize($path, $w, $h); 
    } 

감사와 함께 고정 요청의 헤더 나 ETAG에 대해 그것을 일치하는 데 도움이되는 등장하는 경우 - 없음 - 경기

나는

$this->getResponse()->setHeader('Expires', '', true); 
    $this->getResponse()->setHeader('Cache-Control', 'public', true); 
    $this->getResponse()->setHeader('Cache-Control', 'max-age=3800'); 
    $this->getResponse()->setHeader('Pragma', '', true); 

을 추가합니다.

@Gumbo 아, 내가 잘 이해 :) 수 있도록 노력

감사 모두를.

0

이 코드는 도움이 될 수도 냈다 항상 젠드 프레임 워크에서 동적으로 생성 된 이미지로 캐시 제어를 통합하기 위해 노력하고, 나를 위해 일한 : 난, 난 그냥 빨리 작성하지 않고 있음을 알 수

if ($mod_since = $this->getRequest()->getHeader('If-Modified-Since')) { 

    $request_modified = explode(';', $mod_since); 
    $request_modified = strtotime($request_modified[ 0 ]); 

} 
if ($this->getFiletime($path, $filename) > 0 && $this->getFiletime($path, $filename) <= $request_modified) { 

    // Image has not changed since last call, force Browser to reload from cache. 
    header('HTTP/1.1 304 Not Modified'); 
    exit(); 

} else { 

    // Image has changed or browser has no cache 
    $mimetype = $this->getMIMEType($path, $filename); 
    $format = substr(strstr($mimetype, "/"), 1); 
    $this->getResponse()->setHeader('Content-type', $mimetype); 
    $expires = 60 * 60 * 24 * 3; 
    $exp_gmt = gmdate("D, d M Y H:i:s", time() + $expires) . " GMT"; 
    $mod_gmt = gmdate("D, d M Y H:i:s", $this->getFiletime($path, $filename)) . " GMT"; 

    $imagedata = $this->_processor->processImage($path, $filename, $w, $h, $crop, $format); 

    // Send Headers for Browser Caching Control 
    $this->getResponse()->setHeader('Expires', $exp_gmt, true); 
    $this->getResponse()->setHeader('Last-Modified', $mod_gmt, true); 
    $this->getResponse()->setHeader('Cache-Control', 'public, max-age=' . $expires, true); 
    $this->getResponse()->setHeader('Pragma', '!invalid', true); 
    $this->getResponse()->setHeader('Content-Length', strlen($imagedata), true); 
    $this->getResponse()->setHeader('ETag', md5($imagedata), true); 

    // Save image in Zend Framework's server side Cache or get it from there 
    $cache_id = str_replace(".", '', $path . "_" . $filename . "_" . $w . "_" . $h . "_" . $crop . "_" . $format); 

    if (!$result = $this->_cache->load($cache_id)) { 
     $result = $imagedata; 
     $this->_cache->save($result, $cache_id, array('image', $path . '_' . str_replace(".", '', $filename))); 
    } 
    echo $result; 
}