Dinamik olarak oluşturulan JavaScript dosyaları önbelleğe olurdu?

6 Cevap php

Yani benim uygulama js dosyaları bir çok kullanır. http istekleri bir sürü bu. Ben işlevselliği ile Clubbed 3-4 dosya paketler halinde sunucuda bunları dinamik olarak birleştirme kararı aldı.


My client side request is: ...script type="text/javascript" src="http://mydomain.com/core-js.php" ...

My server side does: --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');


Ben bir uzak gelecekte çekirdek-js.php üstbilgi sona kuruyorum. Benim sorum, çekirdek js.php istemci tarafında önbelleğe olacak mı? Olurdu, birisi nasıl açıklayabilir misiniz?

Teşekkürler!

6 Cevap

İstemci biliyor ya da ne kendisine gönderdiğimiz birlikte birkaç dosya sunucu tarafı getirerek memnun olduğunu umursamıyor. İstemci if önbelleğe alma başlıkları doğru önbelleğe gerekir. Eğer PHP PHP sayfaları önbelleğe almayı istemiyorum dinamik şeyler için kullanılacak eğilimindedir beri, (Firefox + Kundakçı bunun için iyi) bu çatışma, diğer başlıkları gönderme değil yüklemek emin olmak için dikkatli bir şekilde kontrol etmek isteyeceksiniz .

Please see: http://www.jonasjohn.de/snippets/php/caching.htm, you have to check the incoming request headers to send the right response. You can do something like below:

<?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;
?>

Script önbelleğe edilecektir. Veri yok istemciye gönderilir. Sunucu tarafı içerir ve modifikasyon hesaplama her istek için yapılır. Belki önce bir kontrol yapmak için mağaza etag ve oturumu veya çerez olarak değişiklik zamanı içerir ve hesaplamaları. Veya filesizes yerine içerir kontrol edin.

Sen istemci tarafı önbelleği için bir doğrulama mekanizması uygulamak zorunda. Bunun için bir örnek olarak benim class HTTP_Response kullanabilirsiniz.

Kullanımı:

$headers = new HTTP_Response(false);
$headers->set_mime('application/x-javascript');
$headers->send();

(Set halinde) tarayıcıları ve önbelleğe alma vekiller büyük çoğunluğu vade başlığını saygı duyacağız.

Evet olur. Müvekkilinin talep ediyor js dosya içine bir yığın halinde diğer dosyaları bir demet olduğunu bilmiyor, o sadece bir js dosyası, o istenen birini görüyor ve o çekirdek-js.php önbelleğe onu söylüyor. Sürece dosyaya (çekirdek-js.php) adını değiştirmek yok gibi hiçbir sorun olmaması gerekir.

On another note, you should take a look at Minify http://code.google.com/p/minify/ You can merge and cache not only js but css in groups, basically what you're doing. I've been using it for a while with no problems and it's pretty nice.

Evet, ama karmaşık. Varsayılan PHP önbelleğe yazılmasını önlemek başlıkları bir grup ekler. Sen hepsini kaldırarak emin olmak gerekir. Ayrıca, PHP komut anlamak yok If-Modified-Since ve If-None-Match başlıkları? Hatta Last-Modified ve ilk etapta ETag başlıklarını oluşturmak mı? Bu doğru almak zor, neden ve web sunucusu yerleşik tüm bu olduğunda, rahatsız?

Ben farklı bu yapardım. Için istek yapmak core.js, değil core.php. Tabii ki, core.js mevcut değildir, bu nedenle .htaccess isteği yakalar ve index.php yönlendirir. Şimdi index.php gerekli javascript üretir ve istemciye hizmet vermektedir. Ayrıca dosya oluşturur core.js. core.js PHP yakın gitmeden, statik dosyaları normal olarak Apache tarafından ele alınacaktır için gelecek istekleri.

Eğer javascript güncellemek mümkün istiyorsanız ve yerine formun URL'leri kullanabilirsiniz last-modified-timestap.core.js. HTML damgası değiştirme ilk istek üzerine yeni bir JavaScript dosyası oluşturmak olacaktır.

Ben dinamik olarak oluşturulan CSS (tasarımcı veritabanına kaydedilmiş değerleri, yönetim panelinde CSS düzenleyebilirsiniz) için bunu yapmak ve iyi çalışıyor.