Caching görüntü PHP ile istekleri - If-Modified-Since gönderiliyor değil

5 Cevap php

Ben php görüntüleri servis ve yük zaman tasarrufu 304 başlıkları ile yanıt kurduktan bazı sorunlar yaşıyorum.

I Aşağıdaki kod çoğu php.net bulundu. Bu 200 ile yanıt ancak DAİMA, çalışır. For some reason the If-Modified-Since header is not being received on any requests even though I am sending the Last-Modified header initially. Bu bir apache sunucu üzerinde yapılıyor. Herhangi bir fikir ne yanlış olabilir?

Example here.

Bu sayfa diskten görüntü yüklemek ve Last-Modified başlığını göndererek birlikte, tarayıcı gösterecektir. Eğer sayfayı yenilerseniz, tarayıcı olması gerektiği gibi bir If-Modified-Since başlık göndermek değildir.

define('SITEPATH', (dirname($_SERVER['SCRIPT_NAME']) == '/') ? '/' : dirname($_SERVER['SCRIPT_NAME']).'/');

$load_path = $_SERVER['DOCUMENT_ROOT'] . SITEPATH . 'fpo_image.jpg';

// Get headers sent by the client.
$headers    = apache_request_headers(); 
$file_time  = filemtime($load_path);

header('Cache-Control: must-revalidate');
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $file_time).' GMT');

if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $file_time)) {

    header('HTTP/1.1 304 Not Modified');
    header('Connection: close');

} else {

    header('HTTP/1.1 200 OK');
    header('Content-Length: '. filesize($load_path));
    header('Content-type: image/jpeg');                         

    readfile($load_path);

}

5 Cevap

Ben olması gerektiğine inanıyorum

if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) >= $file_time)) {

Değiştirilen zaman daha büyük ya da daha doğrusu sadece eşit eşit olup olmadığını kontrol etme. Ben iki değerleri anlamak her ne kadar should aynı.

mandor at mandor dot net posted a solution benim için çalıştı başlık fonksiyonu için PHP.net belgelerine:

<?php

        // Test image.
        $fn = '/test/foo.png';

        // Getting headers sent by the client.
        $headers = apache_request_headers();

        // Checking if the client is validating his cache and if it is current.
        if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
            // Client's cache IS current, so we just respond '304 Not Modified'.
            header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
        } else {
            // Image not cached or cache outdated, we respond '200 OK' and output the image.
            header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
            header('Content-Length: '.filesize($fn));
            header('Content-Type: image/png');
            print file_get_contents($fn);
        }

    ?>

Bir süre arama yaptıktan sonra, ben cevap buldum. Ben şu başlığı gönderdi kadar tarayıcı şey önbelleğe vermedi (ve If-Modified-Since göndermek vermedi):

Cache-Control: private;

Bunu yaptıktan sonra tüm para cezası çalıştı.

Ben gerektiği gibi her şeyi çalışması için azkotoki yıllardan ve yukarıda Zsolti mesajlarının kombinasyonu ile Keith'in çözümü kullanmak zorunda kaldı.

bu yüzden, son bir örnek olacaktır:

<?php

    // Test image.
    $fn = '/test/foo.png';

    session_cache_limiter(false);
    header('Cache-Control: private');

    // Getting headers sent by the client.
    $headers = apache_request_headers();

    // Checking if the client is validating his cache and if it is current.
    if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
        // Client's cache IS current, so we just respond '304 Not Modified'.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
    } else {
        // Image not cached or cache outdated, we respond '200 OK' and output the image.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
        header('Content-Length: '.filesize($fn));
        header('Content-Type: image/png');
        print file_get_contents($fn);
    }

?>

Oturumları o sayfada kullanılan olup olmadığını kontrol edin, bu yüzden, bu deneyin:

session_cache_limiter(false);

Yukarıdaki çalıştı, burada açıklama:

Php oturum mekanizması ara proxyes tarafından önbelleğe için kaçınarak, oturum tanımlama gizlilik artırmak amacıyla bazı otomatik önbellek ilgili başlıkları gönderir:

http://php.net/manual/en/function.session-cache-limiter.php

Onlar hiç bir önbelleğe alma gerçekleştirmek için değil talimat olarak bu otomatik başlıklar, hiç If-Modified-Since başlık göndermek için değil tarayıcı neden olur.