5-3. サ−バサイドスクリプト '99/12〜 (1) Web連携スクリプト * 何を使うか WWWサ−バとデ−タベ−スを連携したり、プログラムを走らせたりするやり方にはいろ いろある。しかし実際的な面を考えると Apache + PHP3 の組み合わせで、どの程度のこ とができるか、先ずこれを攻めるのがいいのでないか。社外用のWWWサ−バに、商用の Netscape Enterprise Server を使うとすれば、そのAPIの NSAPI でWeb連携スクリ プトを書きたいところである。でも社外用のWWWサ−バでテストするわけにはいかない。 もう1台内部ネットに用意しなければならない。これは金銭的な面で "よい子" ではお勧 めではない。また気になるのは、NSAPI がどの程度使われているか。小生の感触ではほと んどない。あまり本もでていないし、 Netscape Enterprise Server のマニュアルにもほ とんど例題は見当たらない。これでは使うことはできない。 ずっとWWWサ−バのアプリケ−ションは、 Netscape の NSAPI と LiveWrite を用いて 記述した方がいいのでないかと思っていた。商用の方が安定性と安全性に優れていると考 えていたからだ。しかし今日、全世界のWWWサ−バの半分はフリ−ソフトの Apache と いう話である。ここ何年間かの間に Apache はセキュリティ的にも十分強靭になったと見 ていいと思う。もはや使うに躊躇する必要はない。 一応 Microsoft 社の名前も出してお くか。Internet Inforamtion Server(IIS) とそのサ−バAPI、ISAPI はどうか。 全く 使う気はしない。そもそもWWWサ−バに、IIS を使おうという考えが小生にはないから だ。Microsoft が次から次に出してくる、概念やら戦略やらインタ−フェ−スやら、理解 するのはもはや困難である。やってみたいけどできんバイ。 * Apache + PHP3 について ( PHP Version 3 を PHP3 と呼ぶことにする ) PHP3 は何でもありのスクリプト言語である。Apache と合体して、 または CGI のように 別プロセスとしても動くことができる。 HTML 埋め込み型のスクリプト言語ということで、 HTML の記述中に PHP3 のコマンドを入れることができる。別に PHP3 のコマンドで HTML を吐き出しても構わないが。少し前、と言っても1年程前は PHP/FI という名称で、バグ も多くあまり注目されていなかった。バ−ジョンが上がって PHP3 になり、急速に整備さ れてきている。これからはサ−バサイドスクリプトは Perl でなく PHP3 といってもいい と思う。サイトは http://jp.php.net/で、PHP 4.0 beta3 公開、'99/11/18。ここ見てた ら PHP 4.0 Beta3 is out!. 11月中に百万サ−バ突破とあった。 PHP3 の特徴はC言語でできることはほとんどできるといってもよい。 ディレクトリやフ ァイル操作、四則演算、if 文などの制御はもちろん。 さらにデ−タベ−スソフトへのア クセスもできてしまう。 各種市販またはフリ−の RDB ソフトにアクセスするための関数 が入っている。他には、線分などで絵を描いて GIF デ−タが作成できる。 XML のパ−サ 関数もあるなど非常に機能は豊富である。PHP3 の記述自体は簡単である。Perl より簡単 という話もある。すぐ使えるようになると思う。細かなことはここでは紹介しない。本の 「PHP徹底攻略」を買って読んでもらいたい。今のところ PHP3 の本はこれ一冊しか出 ていない。PHP3 をインスト−ルした時に入る HTML 形式の日本語ドキュメントも使える。 [ PHP/FI との違い ] ・拡張子が xxx.phtml から xxx.php3 になった。 ・識別タグは から になった。 ・SetShowInfo() は頭にいれなくてもよくなった。 ・Personal Home Page Construction Kit/Form Interpreter と呼ばれていた。 ・PHP3 では PHP:Hypertext Preprocessor と言うようになった。 * PHP3 に見る SSS( Server Side Script ) の動き WWWサ−バ側でスクリプトが実行されるとはどういうことか。下記のように PHP3 スク リプトの中にタイマ−をセットしてみた。どういう風に表示してくるか。 start_desu だ けすぐに出て、後の文字は10秒たって出てくるのか。結果は全部10秒たってから出て きた。WWWブラウザが xxx.php3 という拡張子のファイルを、WWWサ−バにリクエス トすると、サ−バ側では PHP3 の処理系にそのファイルを渡し、解釈実行してプレ−ンな HTML にしてブラウザに返すわけである。サ−バでの処理が遅いと、 こりゃたまらんこと になる。PHP3 を CGI で動かすより、WWWサ−バに組込んで動かす方がいいというのは このことである。これは Apache では、モジュ−ルの DSO 対応インスト−ルが対応する。 /usr/local/apache/htdocs/test.php3 ブラウザでアクセスしてソ−スを見ると ---------------------------------- ------------------------- | | |start_desu
|start_desu
|";?> |henomohe
mai desu

|");?> |0
|
| |" ; ?> 改行の使い方も示しておいた。 \n が本や雑 | 誌で改行に使われていたが、使えなかったぞ。 * 参考文献 http://jp.php.net/ > 本家の日本のミラ−サイト。PHP 3.0.12 source 1857KB。本家は http://www.php.net/。 http://www.cityfujisawa.ne.jp/~louis/apps/phpfi/ > PHP 日本でのサポ−トサイト。先ずはこのサイトを見るとよい。 http://www.asakawa.ne.jp/doc/php/ja/ > PHP3 マニュアル(日本語版)、ja/ref.xml.html XML パ−サ関数など充実している。 * LAPP とか LAMP とか `26/09 Linux、Apache、PostgreSQL、PHP の組み合わせを LAPP という。LAMP ではデタ−ベ−ス のソフトに PostgreSQL でなく MySQL を使う。LAMP こちらのキ−ワ−ドが最初に出たと 思う。大学の先生も "ランプ" って当り前のように話していた。こうしたサ−バはかつて は Sun の Solaris でやるのが普通だったのが、 いつの間にか Linux マシンでやる方が 当り前になった。2006年ぐらいからだろうか。近辺の大学でも予算があまり出なかっ たので、コンパックかデルか適当なパソコンに RedHat Linux互換のフリ−ソフト CentOS を入れてサ−バにしたとか。CentOS はインスト−ルも簡単だし、yum update で毎日、自 動的に最新状態にしてくれるのでなかなかいいとも話していた。参考「Software Design」 2006/09、"特集:LAMPシステム最強化計画"、"第2特集:CentOS徹底活用ハンズオンテク ニック"。最近の Sun のマシンは聞くところによるとあまり評判はよろしくない。評判が いいのはHPのマシンとのこと。RedHat Linux をビルトインしたモデル、時代は変わる。 (2) XML ファイルを扱ってみる * XML パ−サがキ− ともかく一度 XML パ−サなるものを試してみないことには始まらない。 お恥ずかしいこ とにまだ Java の実行環境を整えていないのだ。 これで Java ベ−スの XML パ−サは除 外。いろいろ調べてみたが、 手元のEWSで動かすことができるC言語対応の expat ラ イブラリが試すにはいいようだ。PHP3 にも移植されているので、 あとあと便利かも知れ ない。 Microsoft の IE 5.0 には XML パ−サのダイナミックリンクライブラリが入って いる。これの事例が雑誌などに載っているが、Windows プログラミングができる人はお試 しあれ。expat は "日刊アスキ− Linux" サイトの人が、コンテンツ作成と管理に XML + Apache + PHP3(expat) + PostgreSQL の組み合わせで効果をあげているらしい。ここでは expat を XML ファイルからタグを抽出して PostgreSQL にデ−タを登録する。更に HTML にも変換するのに用いている。元の XML ファイルの DTD は?、まだ定義してないらしい。 あらためて XML パ−サとは何か。 XML ファイルの中のタグやそのデ−タを抽出するのが 基本である。そして HTML に変換するなど、タグを利用して加工するのも含まれるだろう。 XML パ−サとは言わずに XML エンジンと呼んでいるのもある。これは XML ファイル、デ −タといってもいいが、それ自身をいじってしまう。タグで とあって、 デ−タを 男から女にしてしまうとか。タグさえ認識できれば、デ−タベ−スと連携して、デ−タベ −スにタグのデ−タを放り込んでしまうとか、いろいろできるわけだ。XML パ−サには2 系統ある。DOM と SAX を使ったものである。これらは XML ファイルを扱う仕様で、一応 DOM が標準になっているが、多分両者とも使われて行くだろう。 DOM( Document Object Model ) -- W3C 勧告。一応標準になっている。 SAX( The Simple API for XML) -- 個人など、expat はこっちの分類に入る。 しかし XML パ−サがどうやこうや言わなくても要は、 XML のタグの中身を取り出せばい いのだ。自分で適当にプログラム書いても一向構わない。その方が早いかも。DOM と SAX の違いについて。XML ファイルはいわばデ−タのかたまりである。それをかたまりとして 扱うのが DOM、デ−タを一つずつなめていくのが SAX である。DOM 仕様の XML パ−サは XML ファイルからデ−タを紬出し、C言語の構造体の様なデ−タを作る。 これは DOM オ ブジェクトとか DOM ツリ−とかいわれる。SAX の方は考え方は簡単だが、 実装は少しや やこしくなっている。Motif のコ−ルバック関数をイメ−ジして頂きたい。何とかが起き たら報告せよみたいなプログラムになっているのだ。 最後に expat は DOM や SAX のよ うに仕様にはなっていないようだが、処理としては SAX に近いものになっている。 [ XML パ−サの種類 ] ・iPEX エンジン。DOM 対応、約20万円から。http://www.infoteria.com/ が開発。 ・IE 4.0 内臓の DOM。IE 5.0 で本格対応、'99/03 頃リリ−ス。Netscape はまだ駄目。 ・expat ライブラリ、C言語に PHP に Perl 用がある。DTD は無視する。 ・SAX ライブラリ。http://www.megginson.com/SAX/。DTD 対応。Java 用。 ・XML Parser for Java、DOM & SAX。C++のもあり。http://www.alpahworks.ibm.com/。 ・http://java.apache.org/ の XML を HTML に変換する Cocoon というの。 ・IBMの他 Sun、Oracle にも Java ベ−スのパ−サがある。大抵登録すれば使える。 ・他 Oracle 8i に入っている DOM & SAX パ−サや Empress V8.20 内臓の XMLドライバ。 [ 他参考になるもの ] ・「日経バイト」'99/01 の 130 ペ−ジに、DOM を使って XML デ−タをすべてとりだし、 Microsoft Access にデ−タを格納する Visual Basic のプログラムが掲載されている。 IE 5.0 の DOM の実態は C:\WINDOWS\SYSTEM\Msxml.dll ダイナミックリンクライブラ リである。念のため探してみたらここにあった。 * C言語版 expat のコンパイル < XML Parser Toolkit Version 1.1 > 下記の expat_j.tar.gz を取ってきて、INDY IRIX 5.3 でコンパイルしてみた。ソ−スに は Microsoft の VC++ 用のモジュ−ルも入っている。bin ディレクトリに xmlparse.dll, xmltok.dll, xmlwf.exe が見える。lib ディレクトリにも xmlparse.lib, xmltok.lib と いうのがある。最初 VC++ 用にしかないかと思って、ダウンロ−ドするのをためらってい た。よかった。INDY でも問題なくすんなり通った。Apollo でもコンパイルしたがワ−ニ ングが一杯出て失敗。でも修正しようと思えばできる範囲だった。 http://www.jclark.com/xml/expat.html << 本家のホ−ムペ−ジ。 http://www.inac.co.jp/~maki/xml/expat_j.tar.gz << 日本語対応版です。 % zcat expat_ja.tar.gz | tar xvf - % cd expat; ls -F MPL-1_0.html bin/ expat_ja.html sample/ xmlwf/ Makefile expat.html gennmtab/ xmlparse/ Makefile.org expat.mak lib/ xmltok/ % make gcc -O2 -Ixmltok -Ixmlparse -o gennmtab/gennmtab gennmtab/gennmtab.c rm -f xmltok/nametab.h gennmtab/gennmtab >xmltok/nametab.h gcc -O2 -Ixmltok -Ixmlparse -c -o xmltok/xmltok.o xmltok/xmltok.c | % make sample/elements gcc -O2 -Ixmltok -Ixmlparse -c -o sample/elements.o sample/elements.c gcc -O2 -Ixmltok -Ixmlparse -o sample/elements xmltok/xmltok.o .. ./unixfilemap.o % cd xmlwf % xmlwf katou.xml << タグに付け間違いがあるとメッセ−ジが出る。 katou.xml:9:2: mismatched tag % xmlwf とだけやるとオプションが表示される。 [ 一応参考です ] % ftp ftp.jclark.com ftp> ls pub/xml -rw-r--r-- 1 user group 157936 May 29 1999 expat.zip -rw-r--r-- 1 user group 37443 Dec 29 1998 jade-xmlspec.zip -rw-r--r-- 1 user group 18465 Nov 16 21:31 xmlspec.xsl -rw-r--r-- 1 user group 107060 Nov 18 1998 xmltest.zip -rw-r--r-- 1 user group 281324 Jan 1 1999 xp.zip -rw-r--r-- 1 user group 1772 Nov 24 19:30 xpath.xsl -rw-r--r-- 1 user group 3048 Apr 24 1997 xpointer.zip -rw-r--r-- 1 user group 3800 Nov 24 19:30 xslt.xsl -rw-r--r-- 1 user group 195023 Nov 5 04:19 xt-win32.zip -rw-r--r-- 1 user group 525521 Nov 5 04:17 xt.zip * expat を試してみる やってみた最初の感想。 まるで Motif のイベント・ドリブンなプログラムと同じである。 こりゃたまらん。イベント・ハンドラを設定して、指定したイベントが起こった時、アク ションが反応すると言う。expat、ここでのイベントとはタグの開始、 終了それにタグの デ−タが現われた時である。サンプルの elements では、タグの開始が現われた時に階層 の値をカウントしてタグ名を出力する。タグ用のハンドラ関数は XML_SetElementHandler、 そのアクション関数はタグの開始用で startElement、終了で endElement である。 タグ のデ−タ用ハンドラ関数は XML_SetCharacterDataHandler、 アクション関数は charData である。どなんして使ったらいいの?。 PHP の日本語マニュアルがある。この中の "LVII. XML パ−サ関数" に、サンプルが幾つ かある。http://www.asakawa.ne.jp/doc/php/ja/ref.xml.html。実は "Example.1 XML エ レメントの構造" は elements.c の PHP 版である。他にも2つのサンプルがある。 これ で使い方を勉強するか。あるいは SAX が expat と同じ処理の仕方をするので、SAX で勉 強するかだ。しかし何か変である。プログラムの最初に XML_ParserCreate(NULL) でパ− サを作成するのだと。 どうも発想としては XML パ−サというオブジェクトを登場させる ということらしい。ん−、何でこんなことにオブジェクトがいるのか分からん。理解に苦 しむ。どうやら DOM もパ−サ・オブジェクトを登場させるのは同じことみたい。 % cd sample katou.xml % elements < katou.xml ---------------------------- x | << ここは小文字のこと。 Tag1: name | Tag2: katou |agesex 任意のタグは大文字 y |kikon と小文字を区別する。 z z ※初めは age こんなんで試して q みると分かりやすい。 ※expat は XML ファイルに DTD やスタイルシ−トの 定義があっても無視するだけ。 [ elements.c のエッセンス ] #include #include "xmlparse.h" void startElement(void *userData, const char *name, const char **atts) { int i; int *depthPtr = userData; for (i = 0; i < *depthPtr; i++) putchar('\t'); エスケ−プ文字、これはタブ。 puts(name); タグの開始 x,y,z を表示する。 if ( *atts!=NULL ) { printf( "Tag1: %s\n",*atts); *atts++; ここはかとう君が追加してみた。 printf( "Tag2: %s\n",*atts); } *depthPtr += 1; /* これが一番簡単。階層は無視して開始タグだけ表示し printf( "%s\n",name ); てみる。下の endElement もコメントにするか、中身 /* を消す。終了タグを見ないようにしてしまう。 } void endElement(void *userData, const char *name) { int *depthPtr = userData; *depthPtr -= 1; } int main() { char buffer[BUFSIZ]; int depth = 0; XML_Parser parser = XML_ParserCreate(NULL); XML_SetUserData(parser, &depth); XML_SetElementHandler(parser, startElement, endElement); 文字列を buffer、長さを len にセットして解析する。1 を 0 にすると解析やめ。 XML_Parse(parser, buffer, len, 1); ファイルを読みながら buffer に文字列をセットするなり、一度にセットするなり。 XML_ParserFree(parser); } [ もう一つ試して見る ] http://www2.odn.ne.jp/~cab71160/info/expat-j.html にあるプログラム。結果まで載っ てなかったので、試した結果を掲載しておこう。expat のプログラムをじっと見ていても ちっとも分かってこないので、めんどうだけどコ−ドを自分で打ち込んでコンパイルして みた。main プログラムの中の XML_SetCharacterHandler( parser,charData )をコメント にすると下記の char: len(4) と言う2ヵ所は出てこなくなる。 これで概ね expat の動 きは分かった。ところでこのサイト、XML について結構詳しい。SAX 他いろいろ実際にテ ストしている。これから参考にさせてもらおう。 1 : test 2 : title char: len(4) TESTDATA 3 : data char: len(4) DATA * おまけ 年明けて2000年1月半ば、本章をなんとかまとめた。XML のめどがついて、久しぶり に大きな本屋に行った。おお−、ようけ XML を特集した雑誌がでているではないか。 同 じ時期によくこれだけ出たものだ。 eXcelon を Object Design 社のサイトからダウンロ −ドしよかなと思っていたところだったので「DB Magazine」は買ってしまった。eXcelon の何がしかの記事があると期待したがなかった。 「OPEN DESIGN」は1月の初め頃買った かな。XML 分からんな−ともんもんとしていた時だったので、うもすもなくゲット。でも expat の例題はなかった。DOM と SAX のことばかりで。 でも SAX == expat みたいなも のだから、今後参考にさせてもらおう。「JAVA PRESS」も欲しいが、自前購入だし、内容 は「OPEN DESIGN」と似通っていたのでやめた。 「DB Magazine」 2000/02 1,580 円、(株)翔泳社 CD-ROM に eXcelon 2.0 試用版 > "DBエンジニアのためのXML基礎と実践" iPAD 体験版などあり。 「C MAGAZINE」 2000/02 1,200 円、ソフトバンク パブッリシング(株) > "特集:XMLの実用的な利用方法" 「OPEN DESIGN」 No.36 1,840 円、`02/02/01、CQ出版(株) > 連続特集:つくりながら学XML応用編(DOM/SAX/XSL/DB) 「JAVA PRESS」 Vol.10 1,280 円+税金、(株)技術評論社 > "特集:XML&Javaエピソ−ド2、Project X で始めるDOMプログラミング" * おまけその2 << Apollo に expat を展開した様子 >> $ ld MPL-1_0.html Makefile bin/ expat.html expat.mak expat_ja.html gennmtab/ lib/ sample/ xmlparse/ xmltok/ xmlwf/ $ ld bin xmlparse.dll xmltok.dll xmlwf.exe $ ld lib xmlparse.lib xmltok.lib $ ld xmlparse hashtable.c hashtable.h xmlparse.c xmlparse.h $ ld xmltok asciitab.h dllmain.c euc_jp_tab.h iasciitab.h j2uc.c latin1tab.h nametab.h shift_jis_tab.h utf8tab.h xmldef.h xmlrole.c xmlrole.h xmltok.c xmltok.c.org xmltok.h xmltok_impl.c xmltok_impl.h $ ld xmlwf codepage.c codepage.h filemap.h readfilemap.c unixfilemap.c win32filemap.c xmlwf.c (3) Apache と PHP3 の連携 * Apache のスタ−ト % cd /usr/local/apache/bin % apachectl start << apache httpd が5個できる。root で実行のこと。 apachectl start: httpd started % apachectl stop << Apache のデ−モンを全部止める。root で実行のこと。 apachectl stop: httpd stopped PHP3 のサンプルやら、PHP3 関数の日本語ドキュメントを見れるようにしておこう。以下 のようにリンクを張ればいい。いろいろテスト・ファイルはこのディレクトリにおいてお くようにする。 % cd /usr/local/apache/htdocs % ln -s /usr/local/source/php-3.0.12jp-beta4/examples php3 % ln -s /usr/local/source/php-3.0.12jp-beta4/doc-jp php3-doc % ls -F 作ったテストファイル apache_pb.gif manual/ index.html php3/ php3-doc/ test1.php3 * PHP3 を先ず試してみる test1.php3 ブラウザでソ−スを見るとこう表示される ---------------------------- ------------------------------------ | |http://localhost:8080/test1.php3 | |----------------------------------- | | | | | |I am Katou PHP3 の記述のとこはサ−バで | 処理され HTML ファイルとして | WWWブラウザに送られて来る。 test2.php3 ---------------------------- | XML のモジュ−ルが PHP3 に入ったかどうか確認 | 出る。 PostgreSQL の pg_connect() なんかも記 | 述すると無いと出る。ここまでではまだ何も入れ てないので、見つかりませんと出ます。 test3.php3 ---------------------------- いろいろ情報が出て来る。ブラウザからWWWサ | −バに渡された環境変数や Cookie 変数も出して | くれる。XML のモジュ−ルも入ったかどうかが分 | かる。一度やってみること。 * FORM のテスト test.html --------------------------------------------------- |
xxx.php3 を cgi-bin のプロ |Text_1:

グラムにできる。別にhtdocs |Text_2:

においても構わない。 |Submit:

|Reset : |

test.php3 ----------------- | PHP での FORM の書き方には定型があるとのことだ。「UNIX MAGAZINE」'97/10, P.69 に そう書いてあったのだが。この記事のサンプルは PHP/FI で古いので、 PHP3 に書き直し てみた。サンプルの方には SecureVar("name") という記述があるが、PHP3 にはこの関数 はないぞ。SecureVar("name") を最初にもってきて、フォ−ムからの入力だけを受け付け るようにするということだが。 まあともかくhttp://xxx/kero.php3 とアクセスしてみる。 FORM の入力画面がでてきて、"OK" を押すと画面が変わって、今入力した文字列が表示さ れる。そしてブラウザで "再読み込み" をクリックすると、 "フォ−ムデ−タを送り直し ますか?" と出て "OK" を押すと、さてどうなるか。さっき入れた文字列が表示されたま まになる。最初のように FORM の入力画面を出すには、 http://xxx/kero.php3 とアクセ スし直す。 kero.php3 それと「UNIX MAGAZINE」には CGI を使わずにフォ−ムに ------------------------- よるデ−タの受け渡しができるともあった。cgi-bin プロ | グラム=kero.php3 ということだし、PHP 自体WWWサ− | バ側で実行されるわけだし、再帰的な書き方になって、こ | れでいいいのか、結局。 | |
| Enter : | Submit: |
| | | 環境変数も参考に出してみた。PHP_SELF変数は kero.php3 | になっていた。 (4) Apache と PHP3 のインスト−ル * インスト−ルの概要 ここでは動的モジュ−ル組込み対応の Apache を先に作って、 PHP3 を動的に組み込むよ うにしてみる。マシンは INDY IRIX 5.3、コンパイラは gcc 2.7.2.3、perl 5.004_04 な どである。動的モジュ−ル組込みは DSO( Dynamic Shared Object ) という。必要になっ た時にモジュ−ルを動的にロ−ドするため、 Apache 本体の実行メモリは少なくて済むと いうメリットがある。PHP3 などの外部モジュ−ルを付け加えるには、以前だと Apacheを 再コンパイルしなければならなかった。DSO は Apache 1.3.x からサポ−トされた機能で、 他にも APXS( APache eXtenSion ) というものサポ−トされている。それに制御ファイル は基本的に httpd.conf だけになった。 conf ディレクトリには srm.conf, access.conf 入っているが、使うのは推奨してない。一応 httpd.conf ファイルを見た後に見るように はなっているが。 PHP3 には XML 用のル−チンを入れておきたい。 どうもすこし前までは XML 用の expat ライブラリというのがあって、 http://www.jclark.com/xml/ からとってくるらしかった。 しかし今の PHP3 には最初からソ−スに含まれていて、 ./configure --with-xml とやっ て PHP3 の実行モジュ−ルに入れるようになっている。PHP3 の configure で表示される のを見ていると何をサポ−トするのか分かる、checking for PostgresSQL support... no とか checking for XML support... yes とでているのが見える。また configure --help とやると各モジュ−ルを組込む際のオプション指定が分かる。 PostgreSQL を組み込むオ プションは --with-pgsql だが、PostgreSQL 自体をインスト−ルせずに、 configure は PostgresSQL support... yes となったが、make のところでエラ−になった。ちなみに。 [ ダウント−ド&参考サイト ] '99/12/05 現在 Apache の最新バ−ジョンは 1.3.9、 PHP3 は php-3.0.12jp-beta4 とな っている。下記のサイトそれぞれから調べた結果である。 一見 PHP3 は 3.0.6 が最新か のように見える。 最初 ftp.sra.co.jp サイトの /pub/cmd/postgres/php-fi/PHP-3.0.6/ ディレクトリ下のものをとってくるのかなと思った。しかしここにあるのは全部、日本語 化のパッチだった。 http://japache.infoscience.co.jp/ > Apache の日本語サイト。Ver.1.3.9 が '99/08/20 リリ−スされている。 http://jp.php.net/ 本家の日本のミラ−サイト > ここからダウンロ−ドする。(HTTP) PHP 3.0.12 source 1857 KB。 * Apache のインスト−ル % ftp ftp.happysize.co.jp ftp> cd apache ftp> get apache_1.3.9.tar.gz 注.`02/06/01 見たらなかった。 % zcat apache_1.3.9.tar.gz | tar xvf - % cd apache_1.3.9 % ./configure --enable-module=so --enable-module=so は mod_so.cモジュ −ルを組み込むことを意味する。これで Makefile Dynamic Shared Object(DSO)対応になる。 --------------------------------------- |conf_port = 8080 デフォルトは 80。 テストならメ−ルア |conf_serveradmin = ikken@www.nix.co.jj ドレス、サ−バ名は適当でいい。ここで |conf_servername = www.nix.co.jj 設定しなくても/usr/local/apache/conf | | の httpd.conf をいじってもいい。 % make デフォルトでは % make install すると % make install /usr/local/apache 下にインスト−ルさ | れる。 +--------------------------------------------------------+ | You now have successfully built and installed the | こんなんが出たら一応 | Apache 1.3 HTTP server. To verify that Apache actually | 成功。ちゃんと起動す | works correctly you now should first check the | るか apachectl start | (initially created or preserved) configuration files | もすぐやってみること。 | /usr/local/apache/conf/httpd.conf | | | | and then you should be able to immediately fire up | | Apache the first time by running: | | /usr/local/apache/bin/apachectl start | +--------------------------------------------------------+ ※ httpd のオプション : -v でバ−ジョン、-V で設定情報、-h で全オプションを表示。 [ Apache のモジュ−ルについて ] Apache の機能を拡張するモジュ−ルには、Apache のソ−スに入っている内部モジュ−ル と外部からソ−スを引っぱってきて使うモジュ−ルがある。外部のは mod_perl とか暗号 化対応にする SSL モジュ−ルとかある。Java 対応には http://java.apache.org/があり、 Apache に Java Servlet の実行環境を組み込むことができる。同様 perl.apache.org と いうように xxx.apache.org にたいがいある。 内部モジュ−ルはたくさんある。cgi も MIME など多くがモジュ−ル扱いになっているが、 デフォルトで入っている。 今の httpd にどんなモジュ−ルが入っているか確認するには、 % httpd -l とやる。 Apache 1.3.9 のデフォルトでは http_core.c から数えて18個あ った。下記では % configure --enable-module=so --enable-module=proxy とやって、2 個追加になっている。--enable-module=proxy のが mod_proxy.c である。 % httpd -l mod_proxy.c は Apache に Proxy の機能を追加する。 Compiled-in modules: Caching Proxy Module( HTTP, HTTPS, FTP )。HTTPS http_core.c もOKみたい。 実際有効にするには httpd.conf の | ProxyRequests On のコメントを外すこと。他にもプ mod_proxy.c ロキシの設定項目はあるが、 とりあえずこれでいい。 mod_so.c ちょっと注意。既に /usr/local/apache がある場合 mod_setenvif.c % make install しても httpd.conf は上書されない。 ちゃんとリストしておこう。 以下はただ ./configure して入るモジュ−ルである。src ディレクトリに移って % httpd -l とやるとリストされる。 http_core.c mod_env.c mod_log_config.c mod_mime.c mod_negotiation.c mod_status.c mod_include.c mod_autoindex.c mod_dir.c mod_cgi.c mod_asis.c mod_imap.c mod_actions.c mod_userdir.c mod_alias.c mod_access.c mod_auth.c mod_setenvif.c 試しに ./configure -enable-module=most とやってみた、これだけ追加された。これら Apollo でもコンパイルしてみたが、入ったモジュ−ルは同じだった。 mod_vhost_alias.c mod_info.c mod_speling.c mod_auth_anon.c mod_auth_dbm.c mod_digest.c mod_proxy.c mod_cern_meta.c mod_expires.c mod_headers.c mod_usertrack.c mod_unique_id.c mod_mime_magic.c mod_rewrite.c * PHP3 のインスト−ル % ftp ftp.happysize.co.jp ftp> cd php-ja-jp -rw-r--r-- 1 1001 1000 1946307 Aug 1 13:56 php-3.0.12jp-beta3.tar.gz -rw-r--r-- 1 1001 1000 2361416 Sep 15 01:03 php-3.0.12jp-beta4.tar.gz % zcat php-3.0.12jp-beta4.tar.gz | tar xvf - % cd php-3.0.12jp-beta4 % ./configure --with-apxs=/usr/local/apache/bin/apxs --enable-i18n \ --enable-mbregex 注.--enable-i18n : 国際化機能を組み込む --enable-mbregex : マルチバイト文字対応正規表現ライブラリを組み込む --with-apxs=/usr/local/apache/bin/apxs : DSO 対応で作成する。 % make % make install /usr/local/apache/bin/apxs -i -a -n php3 libphp3.so cp libphp3.so /usr/local/apache/libexec/libphp3.so chmod 755 /usr/local/apache/libexec/libphp3.so [activating module `php3' in /usr/local/apache/conf/httpd.conf] -------------------------------------------------------------------------------- README.i18n は一応読んでおくこと。最初に正式版ではないと書かれている。 Apache 共 に DSO でインスト−ルする手順がのっているが、 そのままでは Apache はエラ−で起動 しなかった。 Apache で % ./configure --enable-shared=max 指定ではだめということ である。他気になること。 php3.ini-distを適切な場所(/usr/local/lib/php3.iniなど) にコピーするのをお忘れなく。 すでにPHP3を使っている環境の場合は、php3.ini-distか らi18n. で始まる行をコピーしてください。やらないかんのかな?。 PHP3 の環境をこの ファイルで設定できるみたい。アクセスできるユ−ザを限定するとかじゃないかな。 -------------------------------------------------------------------------------- * Apache のインスト−ル後の状態 % cd /usr/local/apache/conf;ls access.conf httpd.conf.default mime.types.default access.conf.default magic srm.conf httpd.conf magic.default srm.conf.default httpd.conf.bak mime.types % grep php3 *.conf httpd.conf:LoadModule php3_module libexec/libphp3.so httpd.conf:#AddType application/x-httpd-php3 .php3 << コメントを外して httpd.conf:#AddType application/x-httpd-php3-source .phps << おくこと。 [/usr/local/apache] | |-[bin]--- httpd, ab, apachectl, htpasswd, htdigest, dbmmanage, logresolve, | rotatelogs,apxs | |-[conf]-- httpd.conf, access.conf, srm.conf, mime.types, magic | httpd.conf.default をはじめそれぞれの xxx.default ファイル | |-[cgi-bin]-- printenv, test-cgi | |-[icons]---- README, a.gif など。[small]-- README.txt など。 | |-[htdocs]--- apache_pb.gif,index.html。[manual] -- index.html など。 | |-[logs]----- 最初は空、access_log, error_log, httpd.pid | |-[proxy]---- 最初は空 | |-[man]--[man1]-- htpasswd.1, htdigest.1, dbmmanage.1 | [man8]-- httpd.8,ab.8,apachectl.8,logresolve.8,rotatelogs.8,apxs.8 | |-[libexec]-- httpd.exp, libphp3.so << libphp3.so は PHP3 を make install | した時に入った。 |-[include]-- alloc.h, ap.h, ap_compat.h,ap_config.h,ap_config_auto.h, | ap_ctype.h,ap_md5.h,ap_mmn.h,ap_sha1.h,buff.h,compat.h,conf.h, | explain.h,fnmatch.h,hsregex.h,http_conf_globals.h, | http_config.h,http_core.h,http_log.h,http_main.h, | http_protocol.h,http_request.h,http_vhost.h,httpd.h, | multithread.h,rfc1413.h,scoreboard.h,util_date.h,os.h, | util_md5.h,util_script.h,util_uri.h,os-inline.c | |-[include/xml]-- asciitab.h, hashtable.h, iasciitab.h, latin1tab.h, nametab.h, utf8tab.h, xmldef.h, xmlparse.h, xmlrole.h, xmltok.h, xmltok_impl.h * PHP3 のインスト−ル後の状態 [/usr/local/source/php-3.0.12jp-beta4] | |--------- README.QNX README.WIN32 README.i18n README.t1lib | INSTALL INSTALL.DSO INSTALL.REDHAT | |-[doc]--- README, appendixes.html 以下多数の HTML ファイル。 | |-[doc-jp]- appendixes.html 以下多数の HTML ファイル。 | |-[dl]---- Makefile.tmpl crypt/ log/ setup* | README imap/ mssql/ snmp/ | calendar/ informix/ phpdl.h vmailmgr/ | |-[test]-- README file/ math/ testmenu | ary/ func/ reg/ testphp* | basic/ general_functions/ strings/ testphp.awk | classes/ interbase/ template | dbm/ lang/ testall* | |-[tests]- bench.phtml informix.php3 odbc-t3.php3 | cpdf.php3 informix_blb.php3* odbc-t4.php3 | crypt.phtml informix_blob.php3 odbc-t5.php3 | crypt2.phtml informix_proc.php3* pack.phtml | db.phtml informix_ser.php3 pageinfo.phtml | dba.php library.phtml pdf_clock.php3 | dbase.phtml link.phtml pdf_hello.php3 | display.php3 log.phtml sem.php | filestat.phtml mcrypt.php sock_io.php3 | fortest microtime.phtml str_replace.php3 | globaltest msql.php3 syslog.phtml | globaltest.phtml mysql.php3 zlib.php3 | hyperwave.php3 odbc-t1.php3 | implode-explode.phtml odbc-t2.php3 | |-[regtests]- README ary/ classes/ math/ testphp.pl* | TEST* basic/ func/ strings/ | |-[extra]---- cyberlib/ gd/ icons/ phpwatch/ rgd.zip uodbc/ | |-[functions][regex][dbase][convertor][pcrelib] << ソ−スプログラム。 | |-[benchmarks] * PHP3 の xml_parser_create 関数はどこにあるか 一応知っておいたほうがいい。実際 PHP3 の ./configure で XML のモジュ−ルを追加指 定する際、はまらないためにも。xml_parser_create()、つまりここでの XML モジュ−ル の代表関数がどこにあるか。 下の通り PHP3 を展開した functions ディレクトリにソ− スがあった。しかしこれだけでは関数は動かない。Apache に入っている XML のライブラ リ libexpat.a が必要である。このライブラリは James Clark 氏の expat である。下記 の CHANGES ファイルを見ると、変更日付は99年4月31日となっていた。 それにオリ ジナルの配布は http://www.jclark.com/xml/expat.html を見よとある。 % cd /usr/local/source/php-3.0.12jp-beta4/functions % grep xml_parser_create * php3_xml.h:PHP_FUNCTION(xml_parser_create); xml.c: PHP_FE(xml_parser_create, NULL) xml.c:/* {{{ proto int xml_parser_create() xml.c:PHP_FUNCTION(xml_parser_create) xml.c: char thisfunc[] = "xml_parser_create"; % cd /usr/local/source/apache_1.3.9/src/lib;ls Makefile expat-lite/ % ls expat-lite CHANGES hashtable.h utf8tab.h xmlrole.h xmltok_impl.h Makefile hashtable.o xmldef.h xmlrole.o xmltok_ns.c Makefile.tmpl iasciitab.h xmlparse.c xmltok.c asciitab.h latin1tab.h xmlparse.h xmltok.h expat.html libexpat.a xmlparse.o xmltok.o hashtable.c nametab.h xmlrole.c xmltok_impl.c 注.以前の Apache には expat のソ−スは入ってなかった。その Apache で expat を使 えるようにするには expat のソ−スを別に取ってきてライブラリを作り、PHP3 のコ ンパイル時に引っ付ける手順が必要とされた。 ライブラリの作成には expat デイレ クトリの Makefile に下のように3行追加すると、どこかに書いてあった。できたラ イブラリ libexpat.a を試しに強引に、 PHP3 の make の最終段階の ld でくっつけ たら、XML が使えるようになった。どうやらソ−スは Apache に入っているのと、変 わらないみたいだが、ライブラリのサイズは約2倍あった。一体どこが違うんだ−。 Makefile ---------------------- | | |libexpat.a: $(OBJS) | ar -rc $@ $(OBJS) << オブジェクトをア−カイブしているだけだぞ。 |# ranlib $@ << IRIX 5.3 では ranlib コマンドはない。 (5) PHP3 から PostgreSQL を使う * Apache + PHP3 + PostgreSQL + XML のインスト−ル (同じマシンに全部入れる) つまり Apache に組み込んだ PHP3 で、 PostgreSQL モジュ−ルを入れて PostgreSQL の 関数を PHP3 スクリプトで記述したい。今流行のやり方である。最初PHP3 に PostgreSQL を入れて、うまくいったら XML パ−サの expat も入れようと考えた。それが両者を同時 に入れようとするとおかしいのだ。どちらか片方では、なんとかできたのだが。というわ けで、悪戦苦闘した PostgreSQL も XML もインスト−ルした手順を示したい。 % gcc -v Reading specs from /usr/local/lib/gcc-lib/mips-sgi-irix5.3/2.7.2.3/specs gcc version 2.7.2.3 % bison -V GNU Bison version 1.28 % gmake -v GNU Make version 3.75, by Richard Stallman and Roland McGrath. % which ld /usr/local/bin/ld << GNU のリンカ−。 % flex --version << 後先になったがこれは、PostgreSQL のコンパイルで関係す flex version 2.5.4 るかも知れない。 [ Step1 ] Apache を DSO 対応で作成する。PostgreSQL は先の通り作成してインスト−ルしておく。 % cd /usr/local/source/apache_1.3.9 % ./configure --enbale-module=so % gmake % gmake install [ Step2 ] % cd /usr/local/source/apache_1.3.9/src/lib/expat-lite << XML の expat ライ % cp libexpat.a /usr/local/lib/libexpat.a ブラリです。 % cp /usr/local/pgsql/lib/libpq.a /usr/local/lib/libpq.a << PostgreSQL のライ ブラリです。 [ Step3 ] % cd /usr/local/source/php-3.0.12jp-beta4 % ./configure --with-xml --with-pgsql --with-apxs=/usr/local/apache/bin/apxs --enable-i18n --enable-mbregex --enable-track-vars % gmake | 途中 PostgreSQL のル−チンのとこでインクル−ド・ファイルがないとエラ−でストップ する。そのところだけ抜き出して % gcc ... -I/usr/local/pgsql/include と追加してコ ンパイルする。成功したら再度 % gmake とやっていく。確か3っつぐらい PostgreSQLの ファイルがあった。へたに Makefile に追加指定しても、うまくいかない。 | /usr/local/apache/bin/apxs -c -o libphp3.so -I. -I. ./mod_php3.c libmodphp3-so.a -L/usr/local/lib -lpq -lexpat pcrelib/libpcre.a -lm -Lpcrelib -lpcre gcc -DIRIX -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -fpic -DSHARED_MODULE -I/usr/local/apache/include -I. -I. -c ./mod_php3.c ld -shared -o libphp3.so ./mod_php3.o libmodphp3-so.a -L/usr/local/lib -lpq -lexpat pcrelib/libpcre.a -lm -Lpcrelib -lpcre % gmake install /usr/local/apache/bin/apxs -i -a -n php3 libphp3.so cp libphp3.so /usr/local/apache/libexec/libphp3.so chmod 755 /usr/local/apache/libexec/libphp3.so [activating module `php3' in /usr/local/apache/conf/httpd.conf] [ Step4 ] /usr/local/apache/conf/httpd.conf --------------------------------------------- | | |LoadFile /usr/local/pgsql/lib/libpq.so |LoadModule php3_module libexec/libphp3.so | | |Port 8080 |User katou |Group user | | % cd /usr/local/apache/bin % apachectl start * PHP3 コンパイル時の注意 PostgreSQL だけ入れる場合は、 configure してできた Makefile に次のように追記した らできた。そのままだと gmake でエラ−が出て終わりである。-lpq は PostgreSQL のラ イブラリで libpq.a を期待しているわけだ。/usr/local/lib には PostgreSQL をそのま まインスト−ルすると入らない。それで文句が出るという。 libpq.a を /usr/local/lib にコピ−するか、Makefile でパスを記入するかである。 それにしても Makefile は分か りにくい。記述も分からなければ出力も分からない。 /usr/local/pgsql/lib/libpq.a を リンクする時に加えるとずばり書けんのか。-lpq で libpq.a とスっと理解できるか?。 /usr/local/source/php-3.0.12jp-beta4/Makefile ------------------------------------------------- |CPPFLAGS = -I/usr/local/pgsql/include ← 追記 |#APXS_LDFLAGS = -L/usr/local/lib -lpq pcrelib/libpcre.a -lm |APXS_LDFLAGS = -L/usr/local/lib -L/usr/local/pgsql/lib -lpq pcrelib/libpcre.a ↑ -lm まあ何とか、これで PostgreSQL は使えるようになった。 気を良くして XML も入れたれ と ./configure --with-xml ... とやる。APXS_LDFLAGS のとこに -lexpat が追加される ので、libexpat.a を /usr/local/lib にコピ−するか。 さてどの libexpat.a を使うの か。Jclark の http://www.inac.co.jp/~maki/xml/expat_j.tar.gz のものか、Apache に 標準で入っているものか。 つい最近の Apache バ−ジョンで Jclark の expat ライブラ リが入ったようである。よって、ここではその Apache にある方を使えばいい。これでい いかと思えば、Apache を起動するとこでこんなエラ−が出てくる。 % apachectl start Syntax error on line 209 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/libexec/libphp3.so into server: 14722:/usr/local/ apache/bin/httpd: rld: Fatal Error: unresolvable symbol in /usr/local/apache/ libexec/libphp3.so: dlst_insertafter apachectl start: httpd could not be started ここから涙、涙。一日中ああでもないこうでもないとコンパイルにあけくれることになっ た。石井氏のサイトのメ−リングリストのア−カイブをのぞく。 昔の「UNIX MAGAZINE」 の記事も見る。INSTALL.DSO ドキュメントもみる。 APXS_LDFLAGS に -lgdbm を付けると いいというのでやると /usr/local/lib/libgdbm.a がないと怒られる。即 ftp で iij か ら gdbm-1.7.3.tar.gz を取ってきてコンパイル、でもダメ。 gcc じゃなくて IRIX 純正 の cc ならどうか、結果同じ。DSO でも幾つかやり方があるみたいだぞ、これも変。最終 的に、PostgreSQL と expat のヘッダ−ファイルでかち合っているところがあるのでない か。そう感じるのだが。 ここの Makefile と ./configure についても。 % gmake clean では Makefile は消えな い。% gmake distclean で Makefile は消える。./configure やると Makefile ができる。 再度 ./configure をやると新しくできるが、config.cache があるとそれを見てしまうぞ。 % gmake distclean は config.cache も消すので、毎度そうした方がいいが、最初からや ると結構時間がかかってしまう。gmake の最後 ld のとこでだけ、おかしいと思うならば、 libmodphp3-so.a と libphp3.so を消して gmake すれば、 その部分だけの実行で済むが。 さてうまく行きますか。 * Apache + PHP3 + PostgreSQL + XML 連携の確認 % postmaster -S -i << ユ−ザ katou で実行すること。 % ps -ef | grep postmaster katou 29804 1 0 13:12:06 ? 0:00 /usr/local/pgsql/bin/postmaster -S -i % psql -l << postmaster デ−モンが稼働してないと使えない。 datname |datdba|encoding|datpath ----------+------+--------+---------- template1 | 101| 1|template1 regression| 101| 1|regression postg | 101| 1|postg (3 rows) 隣のパソコンの Netscape Navigator から http://192.10.10.5:8080/katou.php3 という ようにアクセスしてみる。なんかドキドキしますね。うまく行きますように。 /usr/local/apache/htdocs/postg.php3 ----------------------------------- | | 注.postmaster が稼働してないとどうなるか。 > ダメ。 Warning: Unable to connect to PostgreSQL Server connectDB()--connect failed: Connection refused Is the postmaster running(with -i) at 'localhost' and accepting connection on TCP/IP port '5432'? in /usr/local/apache/htdocs/ on line 3 Connect error postg.phpp3 postmaster を root で起動しようとするとどうなるか。 > ダメ。 "root" execution of the PostgreSQL backend is not permited. とでて起動しない。