Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/05/24

counter hits
since 1999/11/06


PHP5を試してみる - SOAP extension+Google Web APIsでGoogle検索してみる

memoサンプルは、EXPERIENCEで実際に確認できるようにしてますので、気になる方は見てみてください。

以前にPEAR SOAP+Google Web APIsでGoogle検索してみましたが、PHP5.0.0RC1で大幅改訂(?)されたSOAP extensionを使って試してみました。

このextensionは、元々PHPモジュールとして開発されていたモノがPHP5に(ようやく)取り込まれたモノのようです。関数(というかクラス)ドキュメントは、PHP日本語マニュアルにもありますのでどうぞ。

サンプルの内容は、前回と同様、Googleの検索をWebサービス経由で行うサンプルです。ということで、Google Web APIsの入手方法などの詳細については、PEAR SOAPのページをご覧下さい。。。(^-^;

前準備でPEAR版と異なるところは、「SOAP extension」、つまりPHP拡張モジュールとしての機能になりますので、configure時にオプションを付けてbuildすることになります(ひょっとして、PHP4.0.xの頃のmbstring/mbregexのように「後付け」もOK?未確認)。今回は、configure時に「--enable-soap」を付けてbuildしたPHP5.0.0RC1を使用しました。

なお、前回と同様、GoogleSearch.wsdlは、サンプルと同じディレクトリにコピーしておいてください。

さて、今回のPHPスクリプトの方ですが、

  • WSDLを元にSOAPClientインスタンスを作成
  • 生成したSOAPClientを使ってサービスメソッドをコールし、結果を取得
  • 結果を表示

といったお決まりのパターンですが、PEAR SOAP版の時に作成したproxyオブジェクトを使わない以外はほとんど同じコードでOKです。ただ、今回はページャー(何ページ目を表示する)など、ちょっと色気を出してみました。でも、手は抜いてます。。。(^-^;

PEAR SOAPのコードがあったこともあり、意外とあっさり動いてしまいました。実際に動作を確認したい方は、EXPERIENCEのページへどうぞ。

●google.php

<?php
/**
 * 定数定義
 */
static $COUNT_PER_PAGE = 10;
static $GOOGLE_KEY = [Google Web APIsのライセンスキー[を指定する];
?>
●SOAP extension+Google Web APIsでGoogle検索してみる at <?php echo phpversion(); ?>
<hr>
<form action="google.php" method="get">
キーワード:<input type="text" name="query" value="<?php echo isset($_GET["query"])
    ? htmlspecialchars(mb_convert_encoding($_GET["query"], "euc-jp", "auto"))
    : ""; ?>">
<input type="submit">
</form>
<?php
    if (isset($_GET["query"])) {
        try {
            /**
             * WSDLへのURLを指定し、SOAPClientをインスタンス化
             */
            $client = new SOAPClient("GoogleSearch.wsdl");

            /**
             * 検索キーワードをUTF-8に変換
             */
            $query = mb_convert_encoding($_GET["query"], "utf-8", "auto");

            /**
             * ページ数の初期化
             */
            $page = (isset($_GET["page"]) ? $_GET["page"]++ : 0);

            /**
             * 検索実行
             */
            $result = $client->doGoogleSearch(
                            $GOOGLE_KEY,
                            $query,
                            ($page * $COUNT_PER_PAGE),        // 開始件数
                            $COUNT_PER_PAGE,                // 取得件数
                            true,           // 同じサイトを無視するかどうか
                            "countryJP",    // 国(デフォルトでは米国)
                            false,          // アダルトサイトも含めるかどうか
                            "lang_ja",      // 言語の指定
                            "utf-8",        // 入力エンコーディング
                            "utf-8"         // 出力エンコーディング
                            );
        }
        catch (SoapFault $e) {
            echo $e;    // echo $e->__toString();と等価
            exit;
        }
?>
<hr>
<p>●検索結果</p>
検索時間:<?php echo $result->searchTime; ?> sec /
全<?php echo $result->estimatedTotalResultsCount; ?><?php
    /**
     * 手抜きページャー(^-^;
     */
    $max_page = ceil($result->estimatedTotalResultsCount / $COUNT_PER_PAGE);
    for ($i = 0; $i < $max_page; $i++) {
        $current = ($i + 1);
        if ($i == $page) {
            echo "$current&nbsp;&nbsp;";
        }
        else {
            echo "<a href=\"google.php?query="
                . urlencode(mb_convert_encoding($_GET["query"], "shift_jis", "auto"))
                . "&page=$i\">$current</a>&nbsp;&nbsp;";
        }
    }
?>
<ul>
<?php
        /**
         * 検索結果の表示
         */
        foreach ($result->resultElements as $index => $obj) {
            $title = mb_convert_encoding($obj->title, mb_internal_encoding(), 'auto');
            $snippet = mb_convert_encoding($obj->snippet, mb_internal_encoding(), 'auto');
            echo "<dl>";
            echo "<dt><a href=\"" . $obj->URL . "\">" . $title . "</a></dt>";
            echo "<dd>" . $obj->URL . "</dd>";
            echo "<dd>" . $snippet . "</dd>";
            echo "</dl>";
        }
        echo '<pre>';
        print_r($result);
        echo '</pre>';
    }
?>

[2004/03/23] 上記サンプルに「SoapFault」というクラスがでてきていますが、このクラスは組み込みクラスのExceptionクラスを継承しており、SOAPコールが失敗した場合にthrowされるようです。doyouphpのページからSoapFaultクラスを見るとextendsしていることが分かります。その他の情報は、PHP日本語マニュアルをどうぞ。試しに、$GOOGLE_KEYの値を空文字にして実行してみると、以下のように表示されます。

●$GOOGLE_KEYの値を空文字にした場合の出力(適宜改行しています)
SoapFault exception: [SOAP-ENV:Server] Exception from service object:
                        Invalid authorization key:  in /path/to/google.php:48
Stack trace:
#0 /path/to/google.php(48): soapclient->doGoogleSearch()
#1 {main}
  

ふふふ。。。またいろいろと遊べそうです(^-^;



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.