cssおよびjsファイルの静的圧縮(プロセスの自動化)

ホスティングにmod_gzipがないため、静的圧縮によるcssおよびjs圧縮を実装する必要がありました。 一方、それは良いかもしれません...しかし、一つのことがすぐに起こります。 そのような操作を手動で実行することは可能ですが、非常に非効率的です。これをすべて自動化することが望ましいです。 このような自動化の最も単純なオプションの1つをphpで実装し、ここに示します。



まず、タスクを処理します。 サイトのローカルバージョン(Apache、php)があり、積極的に変更および調整しています。 このプロセスでは、cssおよびjsファイルの圧縮バージョンが必要です(すぐにテストすると、完成した結果が表示されます)。



必要なのは:

  1. すべてのcssおよびjsファイルを検索します(サブフォルダーにある場合でも)
  2. 圧縮バージョンを作成します(毎回ではなく、ファイルが変更された場合のみ)
  3. ファイルの現在のバージョンのサーバーによる自動復帰を実装します(これがブラウザーをサポートしている場合、圧縮形式で)


もちろん、必要に応じてここにファイル統合を追加することは難しくありませんが、これはそれについてではありません...





したがって、必要なすべてのコードが配置されるphpページ(ready.phpなど)を作成します。 このページをブラウザで開くと、圧縮プロセスが開始されます。 サイトが動的にphpにアセンブルされる場合、インクルード( 'ready.php')を登録でき、必要に応じて圧縮が自動的に実行されます。 もちろん、include()のアドレスは実際に登録する必要があります。 ここに1つのニュアンスがあります。このファイルがホスティングで呼び出されるのを防ぐため(ホスティングに存在しない場合がありますが、行を削除するのを忘れることがあります)、ローカルサーバーにいくつかの一意の条件を指定できます、たとえば:



  if(mb_eregi( "ローカルルートフォルダアドレス"、$ _SERVER ['DOCUMENT_ROOT'])){
   include( 'ready.php');
 } 


サーバー上のルートフォルダーのアドレスが一致する可能性は低いですが、他の何かを考えることができます...

ready.phpで、次のようなphpコードを記述します。



 関数準備完了($ dir){
 $ dir = $ _SERVER ['DOCUMENT_ROOT']。$ dir;
 $ ext = array( "js"、 "css");
 for($ i = 0; $ i <count($ ext); $ i ++){search($ dir、$ ext [$ i]);
 }}
関数検索($ dir、$ ext){
 $ dirH = opendir($ dir);
 while(($ file = readdir($ dirH))!== false){
   if($ file!= "。" && $ file!= ".." &&!mb_eregi( "。gzip"、$ file)){
     if(filetype($ dir。$ file)== "dir"){
       search($ dir。$ file。 "/"、$ ext);
     } else {
       if(fnmatch( "*。"。$ ext、$ file)){
         if(!mb_eregi( "gzip"、$ file)){
         //次の行には、見つかったすべてのファイルが表示されます
         // $ dir。$ fileを出力します "<br>";
           $ adr = substr($ dir。$ file、0、strrpos($ dir。$ file、 "。"));
           $ timeF = filemtime($ dir。$ file);
           if(is_file($ adr。 "。gzip。"。$ ext)){
             $ timeG = filemtime($ adr。 "。gzip。"。$ ext);
           }  
           if($ timeF> $ timeG){
           //次の行は圧縮されるファイルを示します
           // $ dir。$ fileを出力します "-GZIP <br>";
             //最小化(yuicompressorとその実際のアドレスが必要です)
             exec( "java -jar yuicompressor.jar"。$ adr。 "。"。$ ext。 "-o"。$ adr。 "。gzipY。"。$ ext);
             //圧縮する
             if(is_file($ adr。 "。gzipY。"。$ ext)){
               shell_exec( "gzip -9 -n -f -c"。$ adr。 "。gzipY。"。$ ext。 ">"。$ adr。 "。gzip。"。$ ext);
               unlink($ adr。 "。gzipY。"。$ ext);
             } else {
               shell_exec( "gzip -9 -n -f -c"。$ adr。 "。"。$ ext。 ">"。$ adr。 "。gzip。"。$ ext);
             }
 }}}}}}
 closedir($ dirH);
 }
 //ここで、ファイルがあるアドレスを書き込みます
準備完了(「アドレス」); 


その結果、name.gzip.jsやname.gzip.cssなどの名前を持つすべてのjsおよびcssファイルの圧縮コピーを取得します(そうでない場合は、最初にアドレスとアクセス権を確認します)。



次に、ノースがファイルの現在のバージョンを返すことを確認する必要があります(キャッシュに関係なく)。 これは、filemtimeラベルをファイル名に追加することによって行われます。 phpでは、これは標準として実装されます。例えば:



  <link href = "/ css / css.v = <?= filemtime($ _ SERVER ['DOCUMENT_ROOT']。" css / css.css ");?>。css" rel = "stylesheet" type = "text / css "> 


完成したリンクは次のタイプでなければなりません。



  <link href = "/ css / css.v = 1263208288.css" rel = "stylesheet" type = "text / css"> 


これはすでに複数回議論されており、詳細はリクエストに応じて見つけることができます。たとえば、「サイトを分散させる、実用的なcss / js」...



htaccessファイルにリダイレクトルールを追加します(圧縮バージョンの存在をすぐに考慮します)。



  Rewriteengine on
 ReWriteCond%{HTTP:accept-encoding} gzip
 RewriteRule ^(。* \。)V = [0-9。] + \。(Js | css)$ /$1gzip.$2 [QSA、L]
 ReWriteCond%{HTTP:accept-encoding}!Gzip
 RewriteRule ^(。* \。)V = [0-9。] + \。(Js | css)$ / $ 1 $ 2 [QSA、L]
 <FilesMatch。* \。Gzip \。(Js | css)$>
  ヘッダーセットContent-Encoding:gzip
  ヘッダーセットCache-control:private
 </ FilesMatch> 


以上です。

その結果、jsファイルとcssファイルを快適に使用し続けると同時に、常に圧縮されたバージョンがブラウザに送られます。



All Articles