2010-11-15 54 views
7

Tôi tạo ra một tập tin style.css.php với mã này:PHP - Gửi gzip nén JS/CSS

<?php 

    $gzip = (ob_get_length() === false && !ini_get("zlib.output_compression") && ini_get("output_handler") != "ob_gzhandler" && extension_loaded("zlib") && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && !headers_sent()); 

    if(!$gzip) header('Location: style.css'); 

    header('Content-type: text/css'); 
    header('Cache-Control: no-cache'); 
    header('Expires: Mon, 1 Jan 1901 04:20:00 GMT'); 

    ob_start('ob_gzhandler'); 

    include "style.css"; 
?> 

Bạn nghĩ gì? Đây có phải là cách tốt để nén tệp js/css không? Có cách nào tốt hơn để làm điều này? Tôi đang thực hiện việc này cho một ứng dụng công khai. có thể được tải xuống bởi bất kỳ ai. Vì vậy, sẽ có những người trên máy chủ được chia sẻ với gzip bị vô hiệu hóa

+0

Tôi cho rằng máy chủ của bạn không hỗ trợ nén? –

+0

Những gì bạn cố gắng đạt được bằng mã này? Lợi thế mong đợi? – zod

+0

Tôi cũng đang thử nghiệm trên máy chủ được chia sẻ và công việc nén. Tại địa phương cũng hoạt động. Hoặc bạn có nghĩa là tự động nén được thực hiện bởi máy chủ? Điều đó có thể không? – Alex

Trả lời

10

Không, không OK. Có rất nhiều điều sai trái ở đó. Bao gồm, không chết sau khi chuyển hướng, không xem xét phương pháp xì hơi, ...

Việc này rất đơn giản với PHP, vì trình xử lý đầu ra zlib tự động phát hiện nén phù hợp để gửi tới máy khách (nếu có); tất cả các bạn phải làm là kích hoạt nó:

<?php 
if (extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler")) { 
    ini_set("zlib.output_compression", 1); 
} 

readfile('style.css'); 
+0

cảm ơn bạn :) tôi có thể hỏi tại sao readfile() tốt hơn bao gồm không? và tôi vẫn nên chuyển hướng nếu điều kiện là sai? Tôi đã sử dụng tiêu đề ("Location") vì tôi nghĩ rằng nó sẽ tiết kiệm một số tài nguyên máy chủ. – Alex

+0

& nếu tôi cố gắng cho phép nén đầu ra trong html được tạo, tôi nhận được thông báo: Chú ý: ob_end_flush() [ref.outcontrol]: không xóa được nén nén zlib đầu ra :( – Alex

+5

readfile() chỉ hút tệp theo khối và bao gồm/yêu cầu sẽ chạy dữ liệu thông qua trình phân tích cú pháp PHP đầu tiên, đây là bước vô ích nếu tệp CSS thuần túy của tệp là –

2

Máy chủ nên tự động thực hiện nếu được định cấu hình đúng cách.

3

Nếu bạn đang phục vụ trang web của mình bằng Apache, bạn có thể sử dụng mod_gzip hoặc mod_deflate. Chúng thường có sẵn trên các máy chủ chia sẻ và có thể được định cấu hình trong các tệp .htaccess.

Thêm các dòng sau vào file .htaccess:

(tức là một trong mỗi mime-type)

+1

Nó không cần phải là một trên mỗi dòng. Xem câu trả lời của tôi: http://stackoverflow.com/questions/4189429/php-sending-gzip-compressed-js-css/4189661#4189661 – Treffynnon

2

Adam là đi đúng hướng nhưng nó không cần phải được một loại MIME mỗi hàng. Xem hướng dẫn sử dụng Apache2 để biết thêm thông tin về số AddOutputFilterByType directive.

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript text/javascript-x application/javascript 
0

SET đầu tiên trong' .htaccess'

RewriteEngine on 
RewriteRule style.css style.css.php 
<IfModule mod_deflate.c> 
AddOutputFilterByType DEFLATE text/plain 
AddOutputFilterByType DEFLATE text/html 
AddOutputFilterByType DEFLATE text/xml 
AddOutputFilterByType DEFLATE text/css 
AddOutputFilterByType DEFLATE application/xml 
AddOutputFilterByType DEFLATE application/xhtml+xml 
AddOutputFilterByType DEFLATE application/rss+xml 
AddOutputFilterByType DEFLATE application/javascript 
AddOutputFilterByType DEFLATE application/x-javascript 
SetOutputFilter DEFLATE 

BrowserMatch ^Mozilla/4 gzip-only-text/html 
BrowserMatch ^Mozilla/4.0[678] no-gzip 
BrowserMatch MSI[E] !no-gzip !gzip-only-text/html 

SetEnvIfNoCase Request_URI 
.(?:gif|jpe?g|png)$ no-gzip dont-vary 
</IfModule> 

recomended tạo thư mục css và đặt tập tin đó.

Với RewriteRule bạn không cần đặt header('Content-type: text/css'); và các chức năng khác đặt gzip trên máy chủ trước khi tiến trình php. mã chạy nhanh hơn ngay bây giờ!

+1

** Quan trọng!** _Một số trình duyệt không hỗ trợ gzip cho css, sau đó đặt gzip chỉ text/html._ Thêm sử dụng được đề xuất ** .htaccess ** với quy tắc này. –

Các vấn đề liên quan