PHPプロ!TIPS+

1. PHPからCairoを使う

皆さんは、PHPから直線や円弧を描いたり文字を描いたりしその結果を画像として出力したい場合やPDFを作成したい場合、どのような方法で処理を実現しますか?画像処理ライブラリであるGD、PDF作成ライブラリであるFPDFといったものを使ったりするのが一般的ではないでしょうか。しかし、今回はCairoと呼ばれる画像処理ライブラリを紹介したいと思います。

Cairoとは画像処理ライブラリの一種で、ベクターベース、クロスプラットフォーム、PDFやPNG、SVG等々様々なバックエンドをサポートしていて、その特徴からFirefoxの次期バージョンやGUIツールキットであるGTK+といったもので使われています。

このような特徴を持つCairoをPHPから使うために、cairo_wrapperという拡張モジュールがあります。この拡張モジュールを用いることによりPHPから容易にCairoを使用することが可能になります。

では、早速使ってみましょう。

pecl install cairo_wrapper-beta

上記コマンドでインストールすることが出来ます。インストール完了後、 cairo_wrapper.soを使用できるようにするためphp.ini等に設定を追加してください。

完了したら、以下のサンプルスクリプトを実行してください。

<?php
$surface 
cairo_pdf_surface_create("sample.pdf"605.0855.0);
$cr cairo_create($surface);

cairo_set_source_rgb ($cr0.00.01.0);

cairo_move_to($cr150150);
cairo_select_font_face($cr ,"VL Gothic"CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size($cr72);
cairo_show_text($cr"PHPプロ!");
cairo_show_page($cr);

cairo_destroy($cr);
cairo_surface_destroy($surface);
?>

「PHPプロ!」と描かれたPDF、sample.pdfが作成されます。もし文字が正しく表示されていない場合は、上記サンプルスクリプトのcairo_select_font_faceに記述してある「VL Gothic」を環境に合ったフォント名に変更してください。

この他にも様々な機能があるのですが、先のサンプルスクリプトのcairo_show_text()の箇所をcairo_text_path()を使用して以下のように変更すると

cairo_text_path($cr, "PHPプロ!");
cairo_set_source_rgb($cr, 0.5, 0.5, 1);
cairo_fill_preserve($cr);
cairo_set_source_rgb($cr, 0, 0, 0);
cairo_set_line_width($cr, 5);
cairo_stroke($cr);

先ほどと微妙に違って、テキストからパスを作成して「こんにちは」という文字を黒の太い線で縁取りをし薄紫色で塗りつぶしています。いかがでしょうか、Cairoをこのような処理をいとも簡単に行うことが可能になります。

また、PDFではなくPNG形式の画像にしたいという場合は、下記サンプルスクリプトのようにcairo_pdf_surface_create()ではなくcairo_image_surface_create()と
cairo_surface_write_to_png()を使うことにより可能になります。

<?php
$surface 
cairo_image_surface_create(CAIRO_FORMAT_ARGB32605.0855.0);
$cr cairo_create($surface);

cairo_set_source_rgb ($cr0.00.01.0);

cairo_move_to($cr150150);
cairo_select_font_face($cr ,"VL Gothic"CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size($cr72);
cairo_show_text($cr"PHPプロ!");
cairo_show_page($cr);

cairo_destroy($cr);
cairo_surface_write_to_png($surface"sample.png");
cairo_surface_destroy($surface);
?>

興味のある方は使ってみてはいかがでしょうか。

2. テンプレート・エンジンSimplateを使ってみよう

PHPのテンプレート・エンジンではSmartyが有名です。SimplateはSmartyテンプレート・エンジンを参考にして、PHP extensionとして動作するようにしたテンプレート・エンジンです。Smartyに比べて機能は制限されますが、非常に高速に動作します。もし Webページへのアクセス速度を向上させたいのなら、Simplateを使ってみてはいかがでしょうか。

まずは、こちらからSimplateをダウンロードし、インストールしてみましょう。各環境に合わせてコンパイル等を行い、php.iniファイルでextensionとして読み込みます。なお、上記サイトではWindows用DLLファイル、Linux用RPMなどをダウンロード可能なサイトも紹介されています。INIファイルでは、以下のような記述になります。

Windows extension=php_simplate.dll
Linux extension=simplate.so

使い方はほぼSmartyとほぼ同様です。ただし、テンプレートにおけるデフォルトのデリミタは <{ と }> になります。また、機能が制限されている分、ロジックとテンプレートをSmartyより明確に分離する必要があります。

それでは、簡単なコードを見ていきましょう。

[ロジック]

<?php
mb_internal_encoding
('UTF-8');
mb_http_output('UTF-8');

$simplate = new Simplate();
$simplate->template_dir 'template';
$simplate->compile_dir 'template_c';

$var1 "Hello World";
$var2 "Asial";
$array1 array('日''月''火''水''木''金''土');

$simplate->assign('var1'$var1);
$simplate->assign('var2'$var2);
$simplate->assign('array1'$array1);
$simplate->display('index.tpl');
?>

[テンプレート]

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p><{$var1}></p>
<p><{$var2}></p>
<ul>
<{foreach from=$array1 key=key item=item}>
<li><{$item}></li>
<{/foreach}>
</ul>
</body>
</html>

デリミタは以下のようにして変更することも可能です。

<?php
$simplate
->left_delimiter '{';
$simplate->right_delimiter '}';
?>

実行速度をPHP5.2.2で比較したところ、Simplateの方が5倍以上早い結果となりました。Smartyの修正子のような機能はありませんが、最新バージョンではprefilter、postfilterやテンプレート上でのinclude fileも利用でき、実用上便利な機能も備わっています。機会があれば、試してみてください。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)