SNSサイトなどで、登録してもらったユーザー情報のURLからホームページのサムネイル画像をプログラムで作成したい場合の方法です。
以前は、Windows上のPHPプログラムで「new COM(‘InternetExplorer.Application’)」オブジェクトを作成してIEブラウザの表示イメージを直接GDライブラリで保存する方法で一旦Windows上にサムネイル画像を作成し、後でLinuxサーバーに転送するやり方で運用していたのですが、Linuxサーバー上で生成するように変更しました。
最初は、wkhtmltopdf(wkhtml2image)WebKitを使って実装しようとも考えたのですがJavascriptを使ったリッチコンテンツが正しくレンダリングされないことがあるので、Windowsでやっていたようにブラウザでレンダリングされた描画内容を画像ファイルに保存する方法にしました。Linuxサーバー上のブラウザはfirefoxにしています。
XvfbというX-serverの仮想フレームバッファ機能がるので、これを利用することでX-serverを起動していないコンソールだけの環境でもブラウザ表示のイメージをメモリに保持することが可能です。これをImageMagickのコマンド・ラインを使って画像ファイルに保存することが可能です。
今回は CentOS 5、PHP 5.1.6 で試しています。
事前に Xvfb と ImageMagick をインストールします。
# yum install Xvfb # yum install ImageMagick # yum install gdk-pixbuf2
PHPのサンプルプログラム sample.php は以下のとおりです。
<?php $url='http://www.yahoo.co.jp'; $file="/tmp/hogehoge.jpg"; //Xvfb 起動 $cmd = 'Xvfb :3 -screen 0 1024x768x24 > /dev/null &'; $ret = system($cmd , $out); //firefoxで表示 $cmd = 'firefox --display=:3 -width 1024 -height 768 '. $url . ' > /dev/null &'; $ret = system($cmd , $out); //表示完了まで20秒待つ sleep(20); //ImageMagickで指定サイズに画像に保存(160x120 の例、原寸の場合は -geometry オプション不要) $cmd = 'import -display :3 -window root -geometry 160x120 -silent ' . $file; $ret = system($cmd , $out); //firefox終了 $cmd = 'killall firefox > /dev/null &'; $ret = system($cmd , $out); //Xvfb 停止 $cmd = 'killall Xvfb > /dev/null &'; $ret = system($cmd , $out); ?>
実際は、データベースに接続して作成対象のURL一覧を取得してループの中で、各々10秒間隔の間をおいて10行目から23行目のような処理を行っています。
killall OSコマンドを使うのでルート権限で
# php -f sample.php
のように実行します。
コメントを残す