PEARライブラリを使ってみよう

このレッスンで学ぶこと

PHPの魅力の一つは豊富にライブラリが用意されていることです。PHP最大のライブラリがPEARです。ここでは、PEARライブラリの一つ「Text_CAPTHA」を使ってみます。これを使う中で、PEARからライブラリの探し方から、自分のプログラムで使う方法などを紹介します。

ここで学ぶポイント

  • PEARライブラリについて

ここで作るプログラムの例

掲示板などへ書き込む時に、スパムや迷惑書込などをされにくくするために、画像認証を行う場面があります。PEARのText_CAPTHAを使って、画像認証を使った掲示板を作ってみます。

画面
画面
画面
画面

画像認証を使った掲示板

簡単なメッセージを残せる掲示板を作りますが、画像認証(CAPTCHA)を用いて、スパムや迷惑書込などをされにくくしています。以下のプログラムを実行するためには、PEARの「Text_CAPTHA」がインストールされている必要があります。

file:bbs-captcha.php から抜粋

require_once "Text/CAPTCHA.php"; // CAPTCHAライブラリの取り込み
...
session_start(); // セッションの開始
// 処理を分岐
$m = isset($_GET["m"]) ? $_GET["m"] : "";
if ($m == "write") { m_write(); }
              else { m_show();  }
// ログの表示
function m_show() {
    global $savepath;
    show_form();
    ...
}
// 書込フォームの表示
function show_form() {
    // セッションIDを元に画像ファイル名を決定
    $captcha_png = "./captcha-img/".session_id().".png";
    // CAPTCHAオブジェクトを生成
    $cap = Text_Captcha::factory('Image');
    $font_setting = array( // フォントの指定
        'font_size' => 20,
        'font_path' => './',
        'font_file' => 'DroidSerif.ttf'
    );
    $cap->init(300, 60, null, $font_setting); // 設定
    $_SESSION['phrase'] = $cap->getPhrase();  // フレーズをセッションに保存
    $png = $cap->getCAPTCHAAsPNG();           // CAPTCHA用の画像を取得
    file_put_contents($captcha_png, $png);    // 画像を保存
    $self = $_SERVER["SCRIPT_NAME"];
    echo <<< __FORM__
<form action="$self" method="get">
    <input type="hidden" name="m" value="write" />
    <div>名前: <input type="text" name="name" value="" size="20" /></div>
    <div>本文: <input type="text" name="body" value="" size="60" /></div>
    <div><img src="$captcha_png" /><br/>
    上の文字を入力: <input type="text" name="captcha" value="" /></div>
    <div><input type="submit" value="書込" /></div>
</form>
__FORM__;
}
// ファイルへメッセージを保存
function m_write() {
    // パラメータの取得
    ...
    $captcha = isset($_GET["captcha"]) ? $_GET["captcha"] : "";
    ...
    // CAPTCHAが正しいかどうか判別する
    if ($_SESSION["phrase"] !== $captcha) {
        die("画像認証(CAPTCHA)に失敗。");
    }
    // 追記保存
    ...
}

PEARライブラリとは?

PEAR(PHP Extension and Application Repository)とは、PHPの拡張ライブラリ群です。
いろいろな拡張モジュールやアプリケーションが登録されており、ネットワーク経由で取得して利用することができます。PEARのライブラリ一覧を見るには、PEARのWebサイトを訪問するのが一番早いでしょう。画面上部のメニューから[Packages]をクリックすると、ライブラリのカテゴリを見ることができます。

PEAR
http://pear.php.net/
PEARのWebサイト
PEARのWebサイト

必要なライブラリを探したいときには、このカテゴリから探すこともできますし、Webサイトの右上に検索ボックスもありますので、そこでキーワードを入れて検索することもできます。今回、作るプログラム「Text_CAPTHA」のライブラリを探すには、キーワードで検索してみるのが早いでしょう。(カテゴリから探すなら「トップ>Packages>Text>Text_CAPTCHA」とたどることもできます。)

PEARコマンドを使ったインストール

PEARライブラリをインストールするには、コマンドラインからライブラリの自動インストールを行う方法が用意されています。

WindowsのXAMPPならば、コマンドラインを表示して、XAMPPのPHPフォルダ(c:\xampp\php)に移動して、PEARコマンドを使ってインストールを行います。

> cd c:\xampp\php                        ←PEARコマンドのあるディレクトリに移動
> pear install Text_CAPTCHA-0.4.3        ←ライブラリのインストール

ダウンロードしたライブラリを使う方法

自分の用意したWebサーバーならともかく、レンタルサーバーではPEARコマンドが使えない場合も多くあります。その場合は、PEARのライブラリをダウンロードして、通常のPHPファイルと同じように扱うこともできます。

以下の、Text_CAPTCHAの紹介ページを開きます。そして、[Download]のリンクをクリックします。すると、バージョン情報が表示されますので、Downloadの下のバージョン番号をクリックすると、アーカイブ一式をダウンロードできます。

Text_CAPTCHAの紹介ページ
http://pear.php.net/package/Text_CAPTCHA

ダウンロードしたアーカイブはTGZ(TAR+GZIP)形式で圧縮されていますので、この形式に対応した解凍ソフトを使って、アーカイブを解凍します。(Windowsなら「+Lhacaデラックス版」などが有名です。)

そして、ダウンロードしたファイル一式を、今回作るサンプルと同じフォルダに配置します。そのとき、PEARの名前規則に則るため、以下のように、Textというフォルダを作り、その下に配置します。

加えて、Text_CAPTCHAは、別のPEARライブラリ「Text_Password」「Image_Text」にも依存していますので、このライブラリも同じようにダウンロードしてコピーを行う必要があります。

フォルダ構成:

+ <Text>
| - CAPTCHA.php
| - Password.php
| - <CAPTHA>
| | - <Driver>
| | | - Equation.php
| | | - Figlet.php
| | | - ...
+ <Image>
| - Text.php

このように、ダウンロードしてライブラリを配置するのは、依存するライブラリが多いとちょっと面倒ですが、出来ないことはありません。可能なら、PEARコマンドを利用してインストールすると良いでしょう。

フォントを配置する

また、画像認証(CAPTCHA)を行うために、適当なフリーフォント(TTF)を用意する必要があります。今回プログラム中で、フォントの指定を行う際に、以下のように指定しています。

    $font_setting = array(               // フォントの指定
        'font_size' => 20,               // フォントサイズ 
        'font_path' => './',             // フォントの配置パス
        'font_file' => 'DroidSerif.ttf'  // フォントのファイル名
    );

つまり、プログラムと同じフォルダに、DroidSeif.ttfという名前のフォントファイルを配置しています。フォントについては、Google Web Font (http://www.google.com/webfonts)から好きなフォントをダウンロードすることができます。ここでは、「Droid Serif」というフォントを使うことにしました。Apacheライセンスで比較的自由に使うことができます。

Droid Serif
http://www.google.com/webfonts/family?family=Droid+Serif&subset=latin

CAPTCHAの使い方

さて、PEARライブラリから「Text_CAPTCHA」のインストールが無事済んだなら、いよいよライブラリを使いましょう。外部PHPファイルの取り込みには、「include」や「include_once」が使えるのでした。しかし、ライブラリの取り込みには、「require」や「require_once」を使うのが一般的です。

require_once "Text/CAPTCHA.php";    // CAPTCHAライブラリの取り込み

「include_once」と「require_once」の違いは、ライブラリの取り込み時にエラーがあるとその時点で処理を停止してくれるという部分です。ライブラリ利用時のトラブルを事前に防ぐ意味でも、require_onceを利用することをお勧めします。

認証用画像の生成処理

画像認証用の画像を生成する処理を以下のように記述します。フォントの設定があるので、ちょっと複雑に見えるかもしれませんが、基本的には、CAPTCHAオブジェクトを生成し、init()メソッドでサイズやフォントを指定し、getCAPTCHAAsPNG()メソッドを使って画像を保存するという処理になっています。また、画像ファイルの中に描画した文字は、セッション変数に記憶しておきます。

// CAPTCHAオブジェクトを生成
$cap = Text_Captcha::factory('Image');
$font_setting = array( // フォントの指定
    'font_size' => 20,
    'font_path' => './',
    'font_file' => 'DroidSerif.ttf'
);
$cap->init(300, 60, null, $font_setting); // 設定
$_SESSION['phrase'] = $cap->getPhrase();  // フレーズをセッションに保存
$png = $cap->getCAPTCHAAsPNG();           // CAPTCHA用の画像を取得
file_put_contents($captcha_png, $png);    // 画像を保存

生成して保存した画像は、そのあと、HTMLのフォームの中で、<img>タグを使って画像を表示します。

<form action="$self" method="get">
    ...
    <div><img src="$captcha_png" /><br/>
    上の文字を入力: <input type="text" name="captcha" value="" /></div>
    <div><input type="submit" value="書込" /></div>
</form>

そして、画像認証に成功したかどうかを調べるには、セッションの保存された値と、ユーザーが入力した値が合致するかどうかを調べます。

$captcha = isset($_GET["captcha"]) ? $_GET["captcha"] : "";
...
// CAPTCHAが正しいかどうか判別する
if ($_SESSION["phrase"] !== $captcha) {
    die("画像認証(CAPTCHA)に失敗。");
}

※ちなみに、「die("メッセージ")」は、メッセージを表示してPHPの実行を中断する関数です。

PEARライブラリを活用しよう

ここでは、PEARの利用例として、画像認証(CAPTCHA)の使い方を紹介しましたが、PEARには、認証やベンチマーク、コンソールから暗号化、HTTP通信や画像処理など、さまざまな処理を行うライブラリが用意されています。何か作るときには、使えるライブラリがないか調べてみると良いでしょう。