PHPはSystem iには向いているかもしれないが、私に向いているのか?
今や2,200万個を超えるドメインがPHPを使用しています。これは、全世界のウェブ・サイトの10%に相当します(php.net/usage.phpを参照)。企業が使用する最適なプログラミング言語としても、PHPはJava、C、C++、Visual Basicに次いで5番目にランクされています(www.tiobe.com/tpci.htmを参照)。しかもこの中でPHPは一番すばやく学習でき、ウェブ・サイト開発も最も速くできます。Javaや.NETの開発者よりも確保が容易でコストも安いPHPの開発者による活発なコミュニティもあります。そしてSystem iでもPHPが利用できるようになりました。しかしPHPはあなたにとって便利なものなのでしょうか。本稿では、PHPがJavaや.NETにどの程度匹敵するものであるのかを説明し、PHP環境についてのちょっとしたトピックとPHPという言語の概要をご紹介しますのでお付き合いください。また、データ・アクセス戦略の概要やIDE(統合開発環境)との簡単な比較についてもご紹介します。
PHP:System iのウェブ開発競争における新しい参加者
Javaや.NETといったウェブ開発のライバルに対してPHPが登場すると何が起こるのでしょうか。ライバルを理解するには、それぞれの生い立ちを知っておく必要があります。JavaはC++の次の世代の強力なオブジェクト指向言語として開発されました。ウェブが登場すると、JavaはJ2EEという強力で複雑なAPI群を搭載しました。Microsoft .NETはJ2EEに対応して開発されたものですので、.NETにも複雑なAPI群があります。一方PHPはHTMLスクリプト言語として設計されており、ウェブ開発者はダイナミックなウェブ・ページをすばやく開発することができます。今やPHP 5はオブジェクト指向の機能も提供していますが、迅速なウェブ・アプリケーションの開発用という元々の設計思想は依然として残っています。
では、PHPはJavaとどの程度競合するものでしょうか。それはアプリケーションによって決まります。アプリケーションが複数のアプリケーション、言語、データベースを統合する必要がある企業アプリケーションであれば、PHPはJavaや.NETにかなわないでしょう。しかし、ほとんどのウェブ・アプリケーションがそうであるように、アプリケーションが基本的なダイナミックなサイトのシンプルな要件さえ満たせばよいのであれば、明らかにPHPに軍配が上がります。私はPHPをウェブのS/36だと思っています。PHPはシンプルでありながら迅速な開発を行うことができます。Javaを使うよりPHPを使った方が簡単にできることは、たとえば、PDFの作成、グラフィックの動的生成、ウェブ・サービス、基本的なウェブ開発、などです。さらに、wiki、コンテンツ管理システム、データベース管理ツールなどといったPHP用のさまざまなオープン・ソース・ソフトウェアが利用可能です。
PHPの環境
PHPはApacheに対するCGIプラグインとして動作します。PHPのCGIプラグインは、Apacheのhttpd.confファイル中に、以下のディレクティブで構成されます。
LoadModule php5_module /usr/local/Zend/Core/
modules/apache2/libphp5.so
AddType application/x-httpd-php .php
LoadModuleディレクティブは、i5/OSのlibphp5共有オブジェクト・モジュール用のZend Coreを動的に読み込み、ApacheランタイムがPHPエンジンを使用できるようにします。AddTypeディレクティブは、.phpというサフィックスがついているHTTPリクエストをすべて転送してZend Coreに処理させるようApacheに対して指示します。Windowsシステムでは、LoadModuleはDLLを指定します。しかし、Unixシステムでは共有オブジェクト(SO:Shared Object)ファイルを使用しますので、PHPがSystem iのPASE中で稼働するという重要な点を考慮しなければなりません。さらに、PHPは(.soや.dllプラグインとして)容易に拡張できるように設計されているので、Zend CoreはAIX用にコンパイルされたあらゆるPHP拡張を実行することができます。
iシリーズ用のPHPはZend社(zend.com)から無料で入手できます。Zend社からダウンロードできるにもかかわらず、IBM社の製品番号(5639-ZC1 Zend Core for i5/OS)が付いています。また、Zend社の製品用のIBM製品番号がこの他にも2つあります。5639-ZS1 Zend Studio Professional for i5/OSと5771-ZS1 Zend Studio Professional for i5/OS Supportです。Zend StudioはPCベースの統合開発環境(IDE)で、これもSystem i版が無料で入手できます。Zend Studio環境がどのようなものなのかを図1に示します。ではZend社は一体どこで利益を得ようとしているのでしょうか。同社はライセンス・サポートで営業収入を得ています。Zend社はオープン・ソースのPHPサーバー(Zend Core)への機能強化のほとんどを行っているグループであるという点に注意してください。Zend社はPHPの有償サポートを提供することで事業に成功し、今やSystem iユーザーを含む顧客層の拡大を図っています。
PHPの言語
PHPはスクリプトをベースとした言語です。つまりコンパイルの必要がありません。ソース・ファイルを変更したらすぐにブラウザで動作確認ができます。PHPはHTMLとシームレスに動作るように開発されました。PHPのコードは<?php と?>で囲むことでHTMLの中に記述できます。たとえば、次のコードはPHPの構成情報を一覧表示するPHPの特殊関数を起動します。
<html>
<body>
<?php
phpinfo0;
?>
</body>
</html>
PHPの変数は$記号をつけて区別しています。PHPの変数は型を厳格に区別しません(つまり、変数はどんな型のデータも保持できます)が、整数、浮動小数点、文字列、配列、オブジェクト、null(空値)、ブール値、資源(たとえばSQL接続)などといった型のデータを保持できます。PHPの文字列処理は特に強力で、Perl風の正規表現もサポートしています。奇妙なことに、PHPの文字列連結演算子はドット(.)です。次に示すHTMLのコードは同じ変数に対していろいろな型の値を設定し、カスタマイズしたlistType関数を実行して実行時の変数の型を判断し、それをウェブ・ページ上に表示します。
<html>
<body>
<?php
$whatever = 1;
echo listType($whatever).
';
$whatever = 'Denoncourt';
echo listType($whatever).'
'
; $whatever = array(1, 2, 3, 4, 5);
echo listType($whatever);
function listType($var) {
if (is_int($var)) {
return 'int';
} else if (is_string($var)) {
return 'string';
} else if (is_array($var)) {
return 'array';
}
// TODO add other type checks
return 'not int, string, or array';
?>
</body>
</html>
PHPの変数は$記号をつけて区別しています。PHPの変数は型を厳格に区別しません(つまり、変数はどんな型のデータも保持できます)が、整数、浮動小数点、文字列、配列、オブジェクト、null(空値)、ブール値、資源(たとえばSQL接続)などといった型のデータを保持できます。PHPの文字列処理は特に強力で、Perl風の正規表現もサポートしています。奇妙なことに、PHPの文字列連結演算子はドット(.)です。次に示すHTMLのコードは同じ変数に対していろいろな型の値を設定し、カスタマイズしたlistType関数を実行して実行時の変数の型を判断し、それをウェブ・ページ上に表示します。
<html>
<body>
<?php
$whatever = 1;
echo listType($whatever).
';
$whatever = 'Denoncourt';
echo listType($whatever).'
'
; $whatever = array(1, 2, 3, 4, 5);
echo listType($whatever);
function listType($var) {
if (is_int($var)) {
return 'int';
} else if (is_string($var)) {
return 'string';
} else if (is_array($var)) {
return 'array';
}
// TODO add other type checks
return 'not int, string, or array';
?>
</body>
</html>
PHPの制御フロー用コンストラクトは、有名なforeachコンストラクトなどを含んでおり、Javaのコンストラクトと非常に似ています。また、PHP 5ではJava風のtry/catchブロックを用いた例外処理が追加されました。しかしPHP 5で追加された最大の機能は、おそらくオブジェクト指向プログラミング機能でしょう(ただし、名前空間やパッケージ機能はありません)。次のコードはPersonクラスを宣言して、そのクラスのインスタンスを生成する方法を示しています。
<html>
<body>
<?php
class Person {
private $first = ';
private $last = ';
public function Person(){}
public function setFirst($val) {
$this->first = $val;
}
public function setLast($val) {
$this->last = $val;
}
public function toString() {
return $this->first.' '.$this->last;
}
} $me=new Person();
$me->setFirst('Don');
$me->setLast('Denoncourt');
echo $me->toString();
?>
</body>
</html>
最後にご紹介したいPHP言語の機能は配列です。PHPの配列には、インデックス付き配列と連想配列の2つの種類があります。インデックス付き配列は、ご想像の通り、整数値を指定して要素を取り出すものです。連想配列は、RPGの検索テーブルやJavaのハッシュ・マップのようなものです。連想配列の要素はキーを使用して取り出します。たとえば、次のコードは、顧客番号と姓を、i5/OSのQIWS/QCUSTCDTファイルから取り出した結果セットから一覧表示します。
while ($rs->fetchInto($row, DB_FETCHMODE_ASSOC)) { echo(' No:'.$row['CUSNUM']); echo(' Name:'.$row['LSTNAM']); }
PHPには、図2に示す連想配列を始め、重要な情報を含んだいくつかの連想配列がデフォルトで用意されています。
データ・アクセス用オプション
PHPはもともとオープン・ソースのMySQL関係データベースのみをサポートしていました。MySQLは有名なLAMP(Linux、Apache、MySQL、PHP)という頭文字のなかでも重要な文字になっています。オープン・ソースへ貢献している人たちが他のデータベースやアクセス・プロトコル用のPHP拡張を開発したので、問題が発生しました。つまり、開発されたPHP拡張は、Java用にJDBCが開発されたときとは違って、標準化されていなかったのです。したがって、PHPを使用した開発をする際にまず皆さんが決めなければならないことの1つとして、「どのデータベースAPIを使用するのか」ということが挙げられます。PHPのデータベースAPIには、以下を含む、少なくとも6つの選択肢があります。
- MySql - MySQL固有のデータベースAPI
- Unified ODBC - DB2などさまざまなデータベースにアクセスするための標準化されたAPI群
- PDO ODBC - DB2などさまざまなデータベースにアクセスするための標準化されたオブジェクト指向API群
- Pear DB - より良い標準化を図ることを目的とする多くの他のPHPデータベースAPI拡張上に作られた標準化されたAPI群
- IBM_DB2 - DB2固有のAPI(より一般的にはDB2 Connectとして知られています)
- レコード・レベルのアクセス - Zend Core for i5/OSに同梱されているi5/OS固有のAPI
MySQLはPASE中で実行することはできますが、1番目のオプションは選択できません。というのも、ここでは世界最高のデータベースであるDB2/400を使用したいという皆さんの要望を前提としているからです。3番目のオプションであるPDO ODBCは、オブジェクト指向APIを備えているという点で、2番目のオプションであるUnified ODBCよりは良い選択肢でしょう。4番目のオプションであるPear DBを勧める人は多いのですが、Zend Coreにプラグインを追加する必要があります(ただし、Pear DBやその他のPearスタイルのプラグインの追加は簡単なプロセスではありますが)。IBM_DB2はDB2固有のものですが、DB2はSavoir Faire(1960年代のKlondike Catというテレビ・アニメ・シリーズに出てきたずる賢いフランスのネズミ)のように、どこにでもあります。さらに、IBMはZend社との共同ベンチャーでIBM_DB2 for Zend Core for i5/OSを開発しており、Zend社の製品およびAPIはi5/OSに最適化され、信頼性の上でも十分にテストされています。最後の選択肢であるレコード・レベルのアクセスは、RPGの開発者にとってはおそらく最も満足の行くものではありますが、i5/OS固有のものです。
PHPデータベース用のAPIに関する私のお勧めをお話する前に、私が考える標準開発環境というものを述べておきます。PHPアプリケーションは自分のPC上でローカルに開発および動作確認ができなければなりません。また実運用のデータベースのコピーが自分のPCにあることが望まれます。まずはローカルで動作確認をし、i5のテスト環境上で動作確認をし、そして最後に実運用環境に移行します。
IBMのDB2 for Windowsは設定が比較的に容易で、その開発バージョンはWebSphere Development Studioクライアント(WDSc)のCDに同梱されています。ですから、PHPデータ・アクセスAPI用にDB2 Connectを標準化することができます。しかし、DB2 for i5/OSデータベースがローカル・コピーとして利用できないという場合もあるでしょう。たとえば、DB2 for i5/OSのファイルを大量に使用する場合は、上記のシナリオは、実運用データベースのコピーをPC上に作成して持つのに必要なDDLを生成するには適しません。
これを解決する方法として、DB2 Connect for iSeries(www-306.ibm.com/software/data/db2/db2connect/edition-uei.html)を1ライセンス約100ドルで購入するという手があります。このような小額のライセンス購入の承認を得るのが難しい場合(私の経験では、100ドルの購入の承認をもらうより10,000ドルの購入の承認をもらう方が楽です)、あるいはビジネス・パートナーからDB2 Connect for iSeriesを入手できない場合(これもよくある話です)、あるいは購入して物が届くまで待てないという場合は、PDO ODBCとIBM iSeries Access for Windowsが使用できるようになっているODBC接続を使用することができます。
私の結論は1つの選択肢に決めない、というものです。そうです。選択した実装方法を隠蔽するデータ・アクセスAPIのコードを薄いベニヤ板のように作成するというのが一般的なやり方です。これは私自身何年にもわたってJavaで実践してきたことです。こうしておけば、低レベルのデータ・アクセスAPIの実装を追加したり置き換えたりするプロセスが簡単になります。このデザイン・パターンはデータ・アクセス・オブジェクト(DAO:Data Access Objects)と呼ばれていて、IBMのレッドブックDeveloping PHP Applications for IBM Data Serversに詳述されています(DAOに関する上記のレッドブックや本稿で触れたその他の情報源の探し方については、後述の「Find Out More(さらにお知りになりたい方に)」を参照してください)。DAOを使用すると、たとえばアプリケーションとLinux上のPostgreSQL、Windows上のMySQL、i5/OS上のIBM_DB2などとをシームレスに接続する設定が容易になります。
最後にお勧めしたいアドバイスは、レコード・レベルのアクセスやその他のi5/OS固有のPHP用APIは使用しないほうが良い、というものです。もちろん、これらを使用すれば、OPNQRYFやOVRDBFなどといったコマンドや、データ・エリアやデータ・キューなどといった機能を使用することができます。しかしPHPコードはSystem iのバックグラウンドがない開発者によって保守されるべきものであると私は強く思います。この他のデータベース接続オプションにはSQLストアード・プロシージャのサポートがあり、SQLストアード・プロシージャでi5/OS固有の機能を隠蔽するのは簡単です。
開発環境
私のお気に入りの3つのPHP IDEは、ノート・パッド、Zend Studio、PHPeclipseです。たしかにノート・パッドはPHP用の統合環境とは言えないかもしれませんが、PHPの開発には、テキスト・エディタが日常的に使われています。事実、私がVi(www.vim.org)やTextpad(textpad.com)を好んで使用するのは、PHP(およびSQL、Java、Cなどさまざまな一般的な言語)のコードを構文強調表示してくれるからです。PHPはスクリプトをベースにした言語なので、コンパイルというステップは不要であり、IDEを読み込むという手間を介すことなく、ウェブ・ページを臨機応変に変更できる機能は便利です。
しかし、実運用に耐えうるレベルのアプリケーションでは、ソフトウェアの構成管理が必要となり、変更はWDScやZend Studioなどといった開発環境と統合された機能を介して行わなければなりません。となるとここでも、コード補完機能、文脈依存ヘルプ、デバッガなどといった機能を期待してしまいます。Zend Studio Professional for i5/OS(図1)は、System iを利用しているユーザーに対して無償で提供されています。Zend Studioはすばやくインストールでき、PHP用のIDEとしては非常に優れています。Zend Studioのデバッガは一級品で、そのコード補完機能はひときわ優れており、ウェブ・サービスを生成する機能も備えています。
とは言うものの、Zend Studioについての懸念が4つあります(私自身はZend社の有償サポートの支援は受けていません)。第一に、マニュアルが十分ではありません。Zend Studioのグラフィックな機能の使用法はマニュアルに記載されていますが、i5/OSでの開発にZend Studioをどのように設定したらよいかについては記載されていません。2番目の懸念は、IFSファイルへの直接アクセスをシミュレートしているZend StudioのFTPスタイルのインタフェースです。私はソースコードをローカルのPCに置いておき、開発がある適度な段階に達したときに実運用システムに移行するようにしています。おまけに、FTPインタフェースを上手く動作できないのです。3番目は、Zend StudioにはZend Core(PHPのランタイム)のローカル・コピーが同梱されていますが、PHPの設定を変更する方法がマニュアルに記載されていません。IBM_DB2やPOD ODBCのプラグインを追加する方法がわからないので、これは本当に困ります。Zend Studioに関する4番目の懸念は、実は正直に申し上げて、また別のIDEの使い方を覚えたくないのです。なぜまた新しいIDEの使い方を覚えなくてはならないのでしょうか。私はWDScを使用して、RPG、Cobol、CLP、Perl、C、C++、Java、DDS、SQL、HTML、JavaScript、JSPなどを開発しています。PHPの開発になぜWDScが使えないのでしょうか。
オープン・ソースのPHPeclipseプラグインをインストールすれば、WDScでPHPの開発を行うことができます(sourceforge.net/projects/phpeclipse)。PHPeclipseをWDSc 6.0で実行している様子を図3に示します。PHPeclipseをインストールするのは簡単ですが、PHPランタイムは同梱されていません。PHPランタイムを自分でインストールしなければなりませんし(php.net/downloads.php)、Apacheもインストールしなければなりません(httpd.apache.org)。PHPとApacheの自動インストーラーが利用でき、それを使用するとApache 1.xが読み込まれますが、私はSystem i環境と相性の良いApache 2.0をインストールすることをお勧めしています。Windows用のPHP開発環境を設定するのに数時間を要することになりますが、構成ファイルがSystem iの構成ファイルと似ていることを考えれば、費やす価値のある時間です。PHPeclipseのもう1つの注意点は、PHPeclipse 1.1.5ではEclipse 3.1が必要であるのに、WDSc 6.0はEclipse 3.0上で動作するので、PHPeclipse 1.1.4をインストールしなければならないということです。PHPeclipse 1.1.4で本当に唯一問題となるのは、PHPeclipseのデバッグ機能が1.1.4では利用でき ないということです。しかし、どのみち私はデバッガを使用しません。代わりに私は、RPGにはLog4i、JavaにはLog4j、JavaScriptにはLog4js、PHPにはLog4phpなどといったロガーを使用します。
私のPHPeclipse開発環境のコンポーネントをまとめると以下のようになります。
- 使用しているSystem iと相性の良い標準のPHPをインストールして設定
- System iへのコードの移行はWDScの統合Antツールを使用
- PHPeclipseの単体テストツールを使用
- SQLアクセスにはWDScのデータ・パースペクティブを使用
- サブバージョン・ソース管理のサポートを追加してくれるEclipseのプラグインであるSubclipseを使用
- ログおよびデバッグ機構としてLog4phpを使用
最後に面白い情報を1つ。Zend社はZend StudioのEclipse版を今年の初めにリリースすると発表しました(本稿がお手元に届く頃までには、すでに入手可能になっているかもしれません)。
PHP4i
PHPはウェブ用のS/36です。PHPはシンプルでありながら迅速な開発を行うことができます。PHPはRPGプログラマが覚えるには最も簡単なウェブ開発用言語です。しかも、Javaや.NETの開発者よりも確保が容易でコストも安いPHPの開発者による活発なコミュニティもあります。PHPはオブジェクト指向プログラミング機能も備えるところまで進化してきています。こうした機能はJavaに匹敵するフレームワークの創造を引き起こすでしょう。しかし、PHPアプリケーションがもっと高度なものになればなるほど、Javaを使用するほうが理に適っています。