Şu anda bana mod_gzip
veya mod_deflate
olanak bırakmayacak bir sunucudan CSS ve JS dosyaları hizmet etmeye çalışıyorum. Yani GZIP ile sıkıştırmak ve kullanıcıya geri dönmek için küçük bir PHP komut dosyası yazdı.
Örnek Kod:
$filename = "style.css";
if (!file_exists($filename) || !($info = stat($filename))) {
header("HTTP/1.1 404 Not Found");
die();
}
header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("Etag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Cache-Control: Expires ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/html");
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
Ben şu anda burada iki sorun yaşıyorum. İlk ben sorun içerik uzunluğu tarayıcısını bilgilendirmek için sıkıştırılmış dosyanın çıkan boyutunu belirlemek yaşıyorum, olduğunu. Normalde, ben bu satırı içerir:
header("Content-Length: ".$info["size"]);
Ben yaparsam daha fazla veri beklemek çalışırken Ama, tarayıcı kilitleniyor. Toplam boyutunu hesaplamak için bir yolu var mı? Yoksa bu başlık yönergesini görmezden gerekir.
Diğer konu Firefox'ta bu PHP dosyasını görüntülemek zaman, bana sonucu indirmek için çalışır, olduğunu. Ben beklediğiniz gibi Chrome, sadece görüntüler. Herhangi bir öneriniz?
Edit: Soapbox sayesinde, bu ile kodun sonuna değiştirilir:
header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);
Bu içerik-uzunluk için harika çalışıyor! Ama hala dosyayı indirmek yerine görüntülemek için Firefox'u alıyorum. (
Edit Again: İşte modifiye sonu kodu kod, Cletus nezaket olduğunu.
// Start buffered output
ob_start();
// Check for gzip capability
if (stripos($_SERVER['HTTP_ACCEPT_ENCODING'], "gzip") !== false) {
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
} else
echo file_get_contents($filename);
// Write the content length
header('Content-Length: '.ob_get_length());
ob_end_flush();
Ben Firefox dosyasını indirmek için çalışıyoruz tutar neden anlamaya yeni bir soru başlatmak için gidiyorum.