سؤال

الآن أنا أحاول أن تخدم CSS و JS الملفات من الخادم التي لن اسمحوا لي أن تمكين mod_gzip أو mod_deflate.لذلك كتبت صغيرة PHP النصي مع ضغط GZIP والعودة إلى المستخدم.

رمز المثال:

$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();

أنا أعاني من مشكلتين الآن.الأول هو: أنا أعاني من مشكلة في تحديد حجم الناتج من الملف المضغوط إعلام المتصفح من طول المحتوى.عادة, سوف تشمل هذا السطر:

header("Content-Length: ".$info["size"]);

لكن, إذا كنت تفعل, المتصفح توقف أثناء محاولة ننتظر المزيد من البيانات.هل هناك طريقة لحساب إجمالي حجم ؟ أو أن أتجاهل هذا رأس التوجيه.

المسألة الأخرى هي, كلما أرى هذا ملف PHP في فايرفوكس ، فإنه يحاول أن يكون لي تحميل النتيجة.في كروم, فإنه يعرض فقط مثل كنت تتوقع.أي اقتراحات ؟

تحرير: شكرا على المنبر, أنا محل نهاية الكود هذا:

header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);

هذا يعمل كبيرة على طول المحتوى!ولكن أنا لا يزال الحصول على فايرفوكس لتحميل الملف بدلا من عرضه.:(

تحرير مرة أخرى: هنا هو تعديل نهاية رمز رمز مجاملة من كليتوس.

// 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();

أنا ذاهب لبدء سؤال جديد لمعرفة لماذا فايرفوكس يبقي تحاول تحميل الملف.

هل كانت مفيدة؟

المحلول

المشكلة هنا هي أن تعرف محتوى طول تحتاج إلى معرفة ما إذا كان العميل يدعم gzip ترميز وكنت قد فوض هذا القرار باستخدام ob_gzhandler.من رؤوس HTTP:

ob_start();
ob_start('ob_gzhandler');

  ... output the page content...

ob_end_flush();  // The ob_gzhandler one

header('Content-Length: '.ob_get_length());

ob_end_flush();  // The main one

نسخة كاملة:

$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("Expires: ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/css"); // note: this was text/html for some reason?

ob_start();
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
header('Content-Length: '.ob_get_length());
ob_end_flush();

هذا هو كثيرا أفضل من أخذ على gzip قضية الترميز نفسك.

نصائح أخرى

كنت بحاجة إلى القيام به أولا بأكمله gzip وقياس النتيجة (سواء عقد محتويات الذاكرة ، أو كتابتها إلى القرص كما يمكنك ضغط ثم ستات التعرف على الملفات المضغوطة) ، ثم كتابة رأس طول محتوى ثم إرسال محتويات الملف.

أو استخدام نقل المقسم ترميز.

لحل قضية فايرفوكس, أعتقد أنك يجب أن تشمل header( "Content-Encoding: gzip" ); حتى أن المتصفح يعرف أن ضغط المحتوى.

أما بالنسبة طول المحتوى, يمكنك محاولة فقط وترك هذه القيمة ، أو محاولة معرفة طريقة استخدام "نقل-ترميز:المقسم" (لا يمكنك jsut إرسال هذا الرأس ، تحتاج إلى تنسيق البيانات خصيصا لذلك).فمن الممكن أن ob_end_flush تمكن تلقائيا التقسيم.

أنصحك الحصول على يريشارك والتقاط ما php النصي هو إرسال ومقارنتها بشكل صحيح يتصرف الخادم لمعرفة ما الرؤوس, وما هي في عداد المفقودين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top