久しぶりに、PHPのスクリプトを書いてみました。
標記のとおり、MTが吐き出したPHPコードなどを圧縮して、ダウンロードを高速化するためのものです。
実現する機能の割には、ライン数が多いように見えますが、特に複雑なことはしていません。
$FileName = "/home/(username)/blog/index.php";
CompressFile($FileName);
などとしてCompressFile()を呼び出すと、$FileNameで指定したファイルの中身を解析して、圧縮してくれます。
成功した場合には、圧縮したファイルのサイズ(byte数)を返し、何らかの問題で失敗した場合には、FALSEを返します(または強制終了)。
中心となるのは、21~27行目です。
21行目では、「/*_~_*/」で囲まれた(複数行にわたる)文字列をコメントと見なし、削除しています。同様に、22~23行目では、「//_~」および「#_~」以降の文字列をコメントと見なし、削除しています。(空白文字(スペース)は、“_”と表記)
#正確には、ダブルクォーテーションやシングルクォーテーションで囲まれた「//」や「#」は除外しなければなりませんが、スクリプトがややしこくなるので、今回は省略しました。
25行目は、連続するタブ文字または改行文字を、1文字のスペースに変換しています。26行目は、連続するスペースを、1文字のスペースに変換しています。
27行目は、「<p>~</p>_<p>~</p>」など、タグの間に挟まれたスペースを削除しています。
もう少し頭をひねれば、mb_ereg_replace()の中の正規表現を、よりスマートなものにできると思いますが、いくつかのパターンで試してみたところ、上記のパターンが最もシンプルなものとなりました。
なお、正規表現は同じでも、その順番を入れ換えてしまうと、正しく動作しません。
MTが吐き出すPHPコードには、「{」と「}」を使わずに、1行に1命令で終わっている行があります。これを意識せずに単純に改行文字を削除すると、行(命令)の終わりが正しく解釈されず、動かなくなってしまいます。
(この現象(の理由)に気付くまで、数日間悩みました)
その他の行は、ファイルの操作に関するものです。
CompressFile()は、$FileNameで指定したファイルについて、念のためバックアップを取ります。次回以降に呼び出された際、オリジナルのファイルとバックアップのファイルのタイムスタンプを比較して、オリジナルのファイルが前回より更新されていたら、ファイルを圧縮します。
(更新されていなければ、処理をスキップします)
これは、次回以降に紹介する(かも知れない)、MTが吐き出すサイトマップ情報(sitemaps.xml)を元に、圧縮すべきファイルを抽出する(更新されたファイルのみ圧縮し、処理を効率化する)ためのものです。
なお、この処理により、SOARISTO工房blogのPHPコードは、平均で16%程度圧縮(軽量化)することができました。
また、生成されたPHPコードは、改行文字のまったくない数珠繋ぎのものとなるため、いわゆるパチリ屋(コピペ小僧)の解析意欲を喪失させる、という副次的な効果もあります。
Post Comment