ばいお軽量化
ばいおブログが激重だと評判が悪かったので、簡単なPHPスクリプトを作ってみた。index.php?entry=318のように、エントリナンバーを後ろに付けると特定の記事を読める。
やるべきことは次の通り。
URLからの引数を得る
entry=318のような書き方をしたとき、そのパラメータを取得する。これは
if(isset($_GET['entry']))
{
$entry = $_GET['entry'];
}
のようにGET[]の連想配列で取得できるようだ。
HTTP GETする
これはその辺にサンプルコードが転がっているので、それを拝借する。
正規表現でiframeを除去する
これが今回の主目的。ばいおブログが重いのは、iframe(インラインフレーム:Webページの中に別のWebページを表示する)が多用されていて、それが自己参照だったり、自分の他のブログを参照していたりする。
ほとんどのブラウザでiframe内のiframeは無視されるようになっているが、理屈上は
- ばいおブログを開く
- iframeで3つのばいおブログを開く
- 3つのばいおブログの中のiframeがまたばいおブログを開く
とねずみ算式に読むファイルが増えて、ブラウザが重くなる。ブラクラの一種と言えるが、前述のように無限ループにはならないので、重くなる程度で済む。
これが重い原因であるので、HTTP GETしてHTMLだけ読んで、その中からiframeを除去してWebブラウザに渡せば軽いブログになる。
リンクを書き換える
こうしてiframeを除去したページも、ブログ内リンクをクリックすると次からは本家にアクセスしてしまい重くなるので、ブログ内リンクは「ばいお軽量化」へのリンクに書き換える。
軽くなったのか?
ばいおもiframeを減らしてだいぶ軽くなったようだが、以前は読み終わるまで数分かかる激重サイトだった。それを「ばいお軽量化」を使ってアクセスすると、おいらの環境で5秒以内には読み終わるようになった。劇的な高速化が図れたことになる。
そもそもHTMLを読むだけなら200msくらいしか時間を使わない。ほとんどの時間はHTMLのレンダリングとかJavaScriptの処理に食われる。画像とか読むものがあれば追加で読む。
この「ばいお軽量化」では、まず「ばいお軽量化」にアクセスし「ばいお軽量化」がばいおブログのHTMLだけ取得する。ここで余分に200msくらい時間を使うが、その後の軽量化が大きく全体としてだいぶ高速化する。
PHPソース
<?php
function http_get($url)
{
$h=fopen($url,'r');
$meta_data=stream_get_meta_data($h); // both PHP4, PHP5 OK
$headers=$meta_data['wrapper_data'];
$result['content']=stream_get_contents($h); // only PHP5, you need write the function for PHP4
fclose($h);
if( preg_match('/^HTTP\/([0-9]\.[0-9]) ([0-9]+)/',$headers[0],$matches) ){
$result['response']=$matches[2];
}
return $result;
}
?>
<?php
$baioblog = "http://baiodao.blog86.fc2.com/";
if(isset($_GET['entry']))
{
$entry = $_GET['entry'];
$baioblog .= "blog-entry-" . $entry . ".html";
}
$response = http_get($baioblog);
$html = preg_replace('//', '', $response['content']);
$pattern = '/http:\/\/baiodao.*?blog-entry-(\d*?)\.html/';
$replace = 'http://www.onaneet.org/baio/index.php?entry='.'${1}';
$html = preg_replace( $pattern, $replace, $html);
echo($html);
?>
もう少しずる賢く行う
PHPを使ってもう少しずる賢くiframeを貼る方法:
<?php
$path = “ログを置く場所”;
$now = getdate();
$hour = $now[hours];
// IPアドレスを得る
$ip = getenv(“REMOTE_ADDR”);
// ログをまだ作っていない状態回避
$log = fopen($path, “a”);
fclose($log);
// ログファイルが見つかったとき
if( file_exists($path) == true )
{
// フラグがFALSEの場合は初めてのIPアドレス
$flag = FALSE;
// ログを開いて、ログにIPアドレスが記録されているかチェック
$log = fopen($path, “r”);
while( ! feof( $log ) )
{
$line = trim(fgets( $log ));
if( strcmp($ip,$line) == 0 )
{
$flag = TRUE;
break;
}
}
fclose($log);
// IPアドレスがログにない(最初の訪問の)場合)
if( $flag != TRUE )
{
$log = fopen($path, “at”);
fputs( $log, $ip.”\n” );
fclose($log);
echo ‘<iframe src=”アクセスしたいサイト“ width=”0” height=”0”>’;
}
}
?>
このように、初回だけPHPでiframeを貼れば迷惑する度合いは減るはず。どうせ同じIPから何度もアクセスしてもカウントされないだろうから。で、夜中の12時にログをcronで削除してやればOK。
さらに上手にやるとしたら、初回はWebページを表示しないでiframeだけ表示して、JavaScriptですぐにリロードをかけてしまう方法が考えられる。すると、最初のアクセスではカウンタだけ回してリロードして二回目以降はiframeしない。
PHPのコードはHTMLには現れないのでユーザからは見えないが、初回にソースを見られるとPHPが出力したiframeが見えてしまう。なので、JavaScriptがそもそもオフのときはコードを実行しないとかすればステルス性は相当高くなるかな。
ランキング
東大生ブログランキング登録しました。ぽちしていただけると喜びます。




