Web Artisan Blog - ウェブ アルチザン ブログ

Linuxサーバー環境でのサイトサムネイル化:PHPで実行

Linux・Unix・Apache

2006年09月20日

アフィリエイトから企業サイト分析まで。訪問者の動きがまるわかりのアクセス解析サービス「リサーチアルチザンプロ」

LINEやSkypeみたいなビデオ通話がブラウザだけでできる!オンライン通話サービス「EZ-Interview - イージーインタビュー」

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関数でコマンド発行)
//Xvfb(仮想Xサーバー)起動
$command = '/usr/X11R6/bin/Xvfb :1 -screen 0 1024x768x24 > /dev/null &';
$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サーバーのようです)
後、これをサービスとすると結構サーバーに負荷が掛かるんで中々難しい問題もあると思いますね。(だからサービス化しているサイトは素晴らしいと思いますが)


Web面接に最適。ブラウザだけでビデオ/音声通話ができるオンライン通話サービス。「EZ-Interview - イージーインタビュー」
訪問者録画機能も付いたシンプルで高機能なリアルタイムアクセス解析「リサーチアルチザンプロ」