本稿はデータベースソフトウェア「SQL Anywhere」およびデータベース全般に関する英語ドキュメントを翻訳する形で提供しています。図など、部分的に英語のままになっていますが、製品のSQL Anywhere自体は完全に日本語化されていますのでご安心ください。
概要
SQL Anywhereは、興味深い機能を備えたシンプルで強力なデータベースです。フットプリントが小さく、自己管理能力と実用性に優れており、エンタープライズデータベースに必要とされる多くの機能を持ちながら、ごく普通のハードウェア上で動作させることができ、管理の手間も最小限で済みます。
さらに、SQL Anywhereはパフォーマンスの高い双方向の同期機能を備えているため、データベースアプリケーションと既存のエンタープライズデータセンターとの統合を簡単に実現できます。この最後の利点は、企業のブログインフラストラクチャにおいて特に重要な意味を持つと考えられます。
この技術情報記事では、WordPressの環境を変更して、SQL Anywhereデータベースと連携して動作できるようにする方法を説明します。
はじめに
この記事はWordPressに焦点を絞っていますが、同様の手法を利用して、ほとんどすべてのPHPアプリケーションを移行できます。ここで取り上げるWordPressの例では、標準のWordPress環境にドロップできるSQL Anywhere用のプラグインを作成します。このプラグインを利用すれば、WordPressのコードに他の変更を加えなくても、SQL Anywhereを使用できます。
この記事では、PHPサポートが有効になっているWebサーバが既にあり、そのサーバにSQL Anywhereがインストールされていることを前提としています。今回の設定では、Apache 2、PHP 5、WordPress 2.3.3、SQL Anywhere 10を使用し、WindowsとLinuxの両方でソリューションをテストしました。
手順としては、まず標準のWordPress環境を出発点とし、wp-db.phpをwp-adminからwp-content\db.phpという名前のファイルにコピーします。このファイルの名前と場所は重要です。サイトに対するアクセスがあると、WordPressソフトウェアはこのファイルを探し、ファイルが存在する場合はそれを既定のwp-db.phpファイルの代わりに使用します。この仕組みを利用して、WordPress用の独自のデータベースアクセス層をプラグインできます。
データベース接続のセットアップ
次に、このdb.phpファイルを編集して、SQL Anywhereで使用できるようにします。SQL Anywhere PHPドライバー(ここを参照)はMySQLと同様のAPIをサポートしているため、「mysql_」を検索して「sqlanywhere_」に置き換えるだけで、移行作業の大半が完了します。
つまり、mysql_connect()をsqlanywhere_connect()に変換すればよいのです。
MySQLとSQL Anywhereでは接続文字列の形式が異なりますが、どちらも同じ基本データ(ユーザー、パスワード、サーバの場所、データベース)を使用します。接続文字列を変換する作業は簡単です。
//MySQL connection $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword); //SQL Anywhere connection $connstr= "eng=" . $dbhost . ";uid=" . $dbuser . ";pwd=" . $dbpassword . ";dbn=" . $dbname . ";links=shmem,tcpip"; $this->dbh = @sqlanywhere_connect($connstr);
必要な作業はこれだけですと言いたいところですが、実際には、ブログの作成を開始する前に、変更しなければならない項目がいくつかあります。
データベーススキーマの移行
まず、データベーススキーマをSQL Anywhere形式に移行します。この作業は、SQL Anywhere移行ウィザード(PDF)を使用することで簡単に実行できます。
しかし、より汎用性の高いソリューションを構築するためには、つまり標準のWordPress環境でSQL Anywhereをシームレスに使用できるようにし、このWordPressアプリケーション内で新しいWordPressブログをだれでも作成できるようにするためには、あといくつか作業を行って、ブログ作成機能を有効にしなければなりません。
大きな変更点は、WordPressのwp_install()関数を置き換えることです。SQL Anywhereの場合は、既存のwp_install()関数のクローンを作成し、2つの関数を追加して、wp_installから呼び出します。
function wp_install($blog_title, $user_name, $user_email, $public, $meta='') { global $wp_rewrite, $wpdb; wp_cache_flush(); //Reset schema information define_sa_schema(); make_db_current_silent(); create_sa_functions(); ... }
define_sa_schema()プロシージャは基本的にグローバル変数$wp_queriesを再定義し、既定のMySQLの構文の代わりにSQL Anywhereの構文を使用してWordPressのスキーマテーブルが作成されるようにします(この関数の完全なリストについては、こちらを参照ください)。
create_sa_functions()プロシージャは、SQL Anywhereの組み込み関数としては存在しないユーザー定義関数をいくつか作成します。SQL Anywhereはこれらの関数の機能をサポートしているため、ここでは、それらの関数を同じ名前のユーザー定義関数として追加し、SQL Anywhereの機能にマッピングしました。
例えば、次のようにします。
function create_sa_functions() { global $wpdb; $wpdb->query( " IF NOT EXISTS( select * from sysprocedure where proc_name = 'MD5' ) THEN CREATE FUNCTION MD5( str varchar(255) ) RETURNS binary(32) BEGIN return HASH( str, 'MD5' ); END; END IF;"); ... }
この関数の完全なリストは、ここで入手できます。
ここまでの作業を終えると、ブラウザからWordPressのホームページにアクセスし、新しい空のブログを作成できます。