IT News > トピックス > Webページサムネイル化 > 保留にしているURL2

Linuxサーバー環境でのサイトサムネイル化:PHPで実行
http://www.res-system.com/item/603

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

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

ウエブサイトの自動スクリーンショット
SimpleAPI の仕組みについて考察してみる
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関数でコマンド発行)

$command = '/usr/X11R6/bin/Xvfb :1 -screen 0 1024x768x24 > /dev/null &';

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

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

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

sleep(60);

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

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

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

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

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

sleep(10);

$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);

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

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

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

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

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

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