ちょっと物知り博士のちょこっと講座 戻る

第18回 良いとこ鳥PHP・・・無敵のWEB言語は語る

我ながら浮気性だと思います。3週間あまりJavaServletに没頭していたが、広島でIBM主催のLINUX研究会の会合があった折、出席者の多くの人がWEB作成言語にPHPなるものを使用していると聞き込み、筆者はPERLとJavaを使っていると強調したのですが、内心ではPHPも一丁やらねばと新たな闘志(??)を書きたてたものです。JavaServletのプログラミングの方法もあらかたマスターしたし、短所も見えてきたところだったので即「PHP」に取り掛かったのです。
次は日本phpユーザー会のサイトの受け売りです。
PHP(PHP:Hypertext Preprocessor)は、 HTMLファイル内に記述するタイプのスクリプト言語です。
通常のCGIとして使用できますが、PHPモジュールをApacheサーバーに組み込むことにより、 Perl/CGIと比較して処理速度の高速化、サーバー負荷の低減が可能です。

PostgreSQL,MySQL,Oracle,Sybaseといった各種データベースとの連携に優れています。
XML,PDF,IMAP,LDAP等各種機能をサポートしており、広範なWebアプリケーションを容易に作成可能です。

(なお、「PHP:Hypertext Preprocessor」はオープンソースのソフトウエアの名称であり、 出版社である「PHP研究所」とは一切関係ありません。)
PHPとはどんなものか。使ってみなくては話になりませんので早速パッケージを入手しました。

PHP3ホームページ(本家): http://jp2.php.net/downloads.php から php-4.0.6.tar.gz
をダウンロードできます。
2001/9/10現在、最新バージョンはphp-4.0.6です。

php4のインストール

@現在の環境ですが
O/S :RedHat Linux 7.1
WWWサーバー :apache_1_3_20
データベース:PostgreSQL-7.0.2
Aユーザーyamasanh でログインしました
Bまず解凍しましょう
フォルダ /usr/local/phpsoc を作成して php-4.0.6.tar.gz をコピーしました
$ tar zxvf php-4.0.3p1.tar.gz

../php-4.0.6 というフォルダが作成されます。
C Makefile を作成します
phpconf という名前を付けて次のようなスクリプトを作成しました

./configure --with-apxs=/usr/local/apache/bin/apxs \
--x-include=/usr/X11R6/include \
--x-libraries=/usr/X11R6/lib \
--with-jpeg-dir=/usr/local/lib \
--with-tiff-dir=/usr/local/lib \
--with-gd-dir=/usr/lib \
--with-xpm-dir=/usr/local/lib \
--with-pdflib-dir=/usr/bin \
--with-pgsql=/usr/local/pgsql \
--with-zlib-dir=/usr/include \
--with-png-dir=/usr/lib \
--enable-ftp \
--enable-versioning

configureを実行します。
$ sh phpconf

Makefile が作られているのを確認してください
上記のスクリプトで --with-apxs と指定しているのは apacheのDSOを用いてインストールするので、 apacheのインストール先と、apxs(モジュールをDSOとして構築するためのツール)の位置を指定しています。
D Makefile の実行とインストール
$ make
$ su
$ make install

これにより/usr/local/apache/libexecにlibphp4.soというライブラリが生成さ れているはずです。
E apacheの設定を行ないます。
インストールを行なうとhttp.confに以下の三つの設定が追加されるはずです。
(1) LoadModule php4_module libexec/libphp4.so
(2) AddModule mod_php4.c
(3) AddType application/x-httpd-php4 .php
AddType application/x-httpd-php-source .phps
F日本語モジュールをインストールする
PHP4だと国際化対応の関数が使えないので、それをモジュールとしてインストー
ルします。今回は以下のモジュールを入れます。
jstring ---->i18nなんたらなどの国際化対応の関数のモジュール
tar zxfv php4_jstring-1.1.1.tar.gz
cd jstring
phpize
./configure
make
make install

mbregex ---->多バイト文字対応の正規表現モジュール
tar zxfv php4_mbregex-1.2.1.tar.gz
cd mbregex
phpize
./configure
make
make install

iconv ---->PHP4からiconvを使うためのモジュール
これはアーカイブファイルからは見つからない
tar zxfv php4_mbregex-1.2.1.tar.gz
cd mbregex
phpize
./configure
make
make install
G apacheの再実行
$ su
# /usr/local/apache/bin/apachectl restart

でapache を立ち上げました。

phpを動かしてみましょう

今のままの設定では .php ファイルを /home/httpd/html へ置くと動作します。
もしユーザー名で URL参照する場合すなわち http://192.168.64.9/~yamahi/hello.php と指定したい場合、 /usr/local/lib に置いた php.ini ファイルへ usr_dir=/home/yamahi と入力し、 /home/yamahi にpublic_html を作成しそのディレクトリへ .php ファイルをuploadする
次のようなコーディングを行なって phpinfo.php と名前を付けて、/home/yamahi/public_html/sample/へupload します。
1 <html>
2 <body>
3
4 <?php
5 phpinfo();
6 ?>
7
8 </body>
9 </html>
ブラウザから http://ドメイン名/~yamahi/sample/phpinfo.php と入力してみます。
phpのインフォーメーションがブラウザ画面へ表示されます。この超簡単なプログラムの中で 4〜6行が PHP の記述です。
どうです簡単でしょう。
次のコーディングはPostgreSQLへのアクセスサンプルプログラムです。
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
4 <title>Guest Book: DB version</title>
5 </head>
6
7 THR Sep 10 2001
8 -->
9
10 <?
11 $database = pg_Connect ("dbname=guestbook user=postgres password=postgres");
12 $result = pg_exec ($database, "select * from parklist");
13 pg_close($database);
14 ?>
15
16 <html>
17 <body>
18 <div align="center">
19 <table border = "1"> <!-- 検索結果を表組みして出力する。-->
20 <caption>検索結果</caption>
21 <?
22 $row = pg_numrows($result); //検索結果の行数を取得する。
23 $arr = pg_fetch_row($result, 0);
24 //検索結果の列の数を取得する(もっと良い方法があるかもしれない)。
25
26 echo "<tr>";
27
28 for($i = 0; $i < count($arr); $i++) //列の数だけループしてフィールド名を出力する。
29 echo "<td>" . pg_fieldname($result, $i) . "</td>";
30
31 echo "</tr>";
32
33 for($i = 0; $i < $row; $i++){ //検索結果の出力を行なう。
34
35 $arr = pg_fetch_row($result, $i); //検索結果の一行分を配列に格納する。
36
37 echo "<tr>";
38
39 for($j = 0; $j < count($arr); $j++){ //配列の要素を出力する。
40 echo "<td>$arr[$j]</td>";
41 }
42
43 echo "</tr>";
44
45 }
46 ?>
47 </table>
48 </div>
49 </body>
50 </html>
10行から14行までと 21行から46行までがPHP プログラムのコーディングです
そうです既に気付いているように <? から ?> までがPHP の受け持つ範囲です。それ以外の行はHTML そのものの記述です。
PHPは HTML ドキュメントそのものといえますね。

Perlとの比較

Perl も PHP もどちらもサーバーサイドで動作します。ブラウザから送られてきた要求がAPACHEを通じてPerl、PHPへ伝えられそれぞれのインタープリタが起動して目的のHTML DOC
を作成してブラウザへ送ります。
こう見ると、違いが無いようにみえます。実際Perlも、PHPもプログラムの文の書き方はよく似ており、一見してその違いは無いように思えるのですが・・・。
大きく違う点があります。
Perl は サーバーでの処理が中心に記述され、結果を HTML に埋め込んで HTML DOCを編集します。
PHP は HTMLの記述が中心でHTMLの記述の中にサーバーでの処理を PHP 言語で埋め込み記述します。

処理スピードはどちらもインタープリタなのでとりわけどちらが速いとはいえませんが、唯一画像データ(.jpg .gif・・)の処理はPHPが際立って早いのです。Perl CGIプログラムで画像データをプログラム中で参照記述をした場合ブラウザへの表示は死ぬほど遅いものです。
それがいやで画像データはすべて/icons/ へファイリングしAPACHE のicons 機能を適用しますがそれでも PHPでの画像データの取り扱いよりも3倍ぐらいは遅いように思います。

JAVAとの比較

PHPは HTML、Perl、Javaの長所を取り入れて作られたインターネット用プログラム言語だと説明がされています。ですから、プログラム構文はJAVA によく似ています。PHPではJAVAでのCLASS の記述も出来ます。
筆者はJAVAとPHPの一番大きな違いは、プログラムの作成の容易さにあると思います。JAVAServletプログラムを作ろうとすれば、JSP で ページの体裁を記述し、データ構成をXMLで記述し、データベースをJDBCを介在して記述し、処理全体をclass でまとめます。
それぞれドキュメントPATH、LD_LIBRARY_PATH、CLASSPATHを指定しなければなりませんし、中でもとりわけ重要なのは CLASS の機能と配置の設計でしょう。
それに引き換え、PHPでは、HTML の記述とサーバー処理の記述を分ける必要は無く、データベースはそれぞれに作られた関数を使用して直接記述できる。 なによりうれしいのは、機能別に記述されたファンクションをそれぞれまとめてファイルし且つそれを適宜includeして使用できるのでプログラムが整理しやすい(もちろん組み方にもよりますが)
JAVAServlet プログラムはコンパイルされたbinary ファイルであるので、理論的には phpで書かれたプログラムよりも格段に早いはずですが、これが対して変わらないのです。変わらないというより、phpのほうが早く感じてしまうのです。多分これはJavaServletの場合最初に要求があったときにインスタンスを生成している時間が必要なので遅く見えるのだと思います。
まあ言語の優劣を論じても仕方の無い事で、結論的なことを言うとすれば大勢で大きなサイトを構築する場合は体系のしっかりしたJavaServletを適用し、一人ないしは数人でこじんまりした(といいながら結構大きなサイトも見受けられます)WEBプログラムを書くのにはPerl,PHPを使ったほうがいいのかな。
特に短納期で作らねばならないような場合には圧倒的にPerl,PHP でしょうか。
PerlとPHP では優劣はないと考えています。開発者の好みの問題なのでしょうね。そういいながら筆者はPerlから入ったにもかかわらず、PHPに大きく魅せられています。Perl を捨てるかも?(うーんそれはあんたの勝手)