IT News > トピックス > Webページサムネイル化

■目次


抜粋URL
http://www.res-system.com/item/603

Linuxサーバー環境でのサイトサムネイル化:PHPで実行
Linux・Unix・Apache (18 items)
2006年09月20日
SimpleAPIに代表されるサイトのサムネイル化サービスですが、最近では更に便利なサービスがどんどん出て来ていますね。それだけサイトのサムネイル化のニーズが高いんでしょう。
斯く言う当サイトも、Research Artisanの解析結果や、ランキングタグにてサイトサムネイル化機能を独自で開発し利用しています。

・・で、どないしてサイトのサムネイル化してんねん?って事ですが、有り難い事に既にネットでも詳しい情報が書かれています。
当サイトでは特に以下のサイトが参考になりました。(ありがとうございます)

ウエブサイトの自動スクリーンショット

SimpleAPI の仕組みについて考察してみる
http://www.drk7.jp/MT/archives/001042.html

webnail - webサイトをサムネイル化

サイトサムネイル化は、Windowsサーバー・Linuxサーバー双方で実現可能ですが、当サイトではLinuxサーバーで実現しています。なので、ここではLinuxサーバーにて実現する方法を記述します。

おおまかな流れ

上記参考サイトからわかるように、サイトサムネイル化の処理の流れは以下のようなイメージになると思います。

1.Xvfb(仮想フレームバッファ)起動

2.firefox(ブラウザ)起動

3.firefox(ブラウザ)でURLにアクセス

4.ImageMagickでスクリーンショットを取る

5.画像保存

6.firefox(ブラウザ)終了

7.Xvfb(仮想フレームバッファ)サーバー終了

要は、自分で1個1個サイトのサムネイルを作成する動き(ブラウザで対象URLにアクセスし、”Print Screen”キーでスクリーンショットを取って画像を保存する)を、Xvfb(仮想フレームバッファ)上でやっている、それをコマンドで叩いている、だけの事なんですね。

この動きで大事なのが、仮想でGUI環境を作成するXvfb(仮想フレームバッファ)とスクリーンショットを取るImageMagickになります。これらはインストール必須。

Xvfbインストール

yum grouplist

yum groupinfo "X Window System"

yum upgrade xorg-x11-xfs

yum upgrade xorg-x11

yum upgrade xorg-x11-devel

yum upgrade xorg-x11-libs

yum groupupdate "X Window System"

yum upgrade xorg-x11-libs

yum install xorg-x11-Xvfb

yum install firefox

ImageMagickインストール

yum install ImageMagick

コード例

長々言葉で書いてもあれなんで、実現コード例を書いてみます。
もちろんシェルでやるのが一般的かもですが、画像加工をGDでやりたいんでコマンド発行自体もPHPでやりたいと思います。(PHPのsystem関数でコマンド発行)

//Xvfb(仮想Xサーバー)起動

$command = '/usr/X11R6/bin/Xvfb :1 -screen 0 1024x768x24 > /dev/null &';
// 1024*768のフルカラー(1677万色)のディスプレイをID1で用意するという意味

$last_line = system($command , $rtn);



//firefox起動(プロファイル”user”で起動)

$command = '/usr/bin/firefox -display :1 -width 1024 -height 800 -P "user" > /dev/null &';

$last_line = system($command , $rtn);

//60秒待つ

sleep(60);



$url = 'http://www.res-system.com/weblog/';



//サムネイル画像パス指定

$thumbimg = '/thumb/t.gif'; //サムネイル画像

$img = '/img/i.gif';        //サムネイル元画像



//firefox上でサイト表示

$command = '/usr/bin/firefox -display :1 -remote "openurl(' . $url . ')" &';

$last_line = system($command , $rtn);

//10秒待つ

sleep(10);



//ImageMagickでスクリーンショットを画像に保存

$command = '/usr/bin/import -display :1 -window root ' . $img;

$last_line = system($command , $rtn);



//保存した画像のサイズを求める

list($width, $height, $type, $attr) = getimagesize($img);



//画像の作成

$im = imagecreatefromgif($img);



//サムネイル画像加工(サムネイル元画像からサイズ縮小)

$thumb_im = imagecreatetruecolor(120, 90);

imagecopyresampled($thumb_im, $im, 0, 0, 0, 90, 120, 90, $width, $height);



//サムネイル画像を保存

imagegif($thumb_im, $thumbimg);



//firefox終了

$command = 'killall firefox-bin > /dev/null &';

$last_line = system($command , $rtn);



//Xvfb(仮想Xサーバー)終了

$command = 'killall Xvfb > /dev/null &';

$last_line = system($command , $rtn);

※コマンド発行後は、sleep関数である程度待つことも重要ですね。
※この処理は、ブラウザからのリクエスト毎にやるより、後でcronでまとめて処理したほうがいいでしょう。

さて、まあこんな感じで実現はできるんですが、サイトサムネイルという処理自体Linuxでやるものなの?っていう疑問もあると思います。いや、上記でできるんですが、如何せん処理時間が掛かるし、Flash満載のサイトのサムネイルが作成しにくかったりと問題も多く、、つまりWindowsサーバーでやる方がいいのではないかと思っています。(はてなスクリーンショットなんかもサムネイル化はWindowsサーバーのようです)
後、これをサービスとすると結構サーバーに負荷が掛かるんで中々難しい問題もあると思いますね。(だからサービス化しているサイトは素晴らしいと思いますが)