Apache 1.3.1 + PHP 3.0.2 インストールメモ


  1. 参考 URL

    Apache
    日本語 Apache(田中さん)
    PHP
    PHP 日本語ページ(広川 類さん)

  2. 石井さんによる PostgreSQL 6.3.2 のインストール手順に従って、PostgreSQL 6.3.2 のインストールが完了していることが前提です。

  3. ソフトウェアの入手

    ねたは以下の URL から持ってきます。

    Apache 1.3.1
    Apache 本家
    PHP 3.0.2a
    PHP 本家

  4. 展開
    server1:/usr/local/etc# tar xvzf /usr/src/apache_1_3_1_tar.gz
    server1:/usr/local/etc# tar xvzf /usr/src/php-3_0_2a_tar.gz 
        
  5. 環境変数の設定

    ~/.profile に以下の1文を追加します。

    export LD_LIBRARY_PATH=/usr/local/pgsql/lib

  6. インストール

    結局、安易な「せっかちな人用」を選びました(^^;。

    server1:/usr/local/etc# cd apache_1.3.1
    server1:/usr/local/etc/apache_1.3.1# ./configure --prefix=/www
    server1:/usr/local/etc/apache_1.3.1# cd ../php-3.0.2a/
    server1:/usr/local/etc/php-3.0.2a# ./configure --with-pgsql --with-apache=../apache_1.3.1 --enable-track-vars
    server1:/usr/local/etc/php-3.0.2a# make
    server1:/usr/local/etc/php-3.0.2a# make install
    server1:/usr/local/etc/php-3.0.2a# cd ../apache_1.3.1/
    server1:/usr/local/etc/apache_1.3.1# ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
    server1:/usr/local/etc/apache_1.3.1# make
    ※この時点で、httpd のバイナリが Apache の bin(ここでは /www/bin)
    ディレクトリにできたはずとのこと
    server1:/usr/local/etc/apache_1.3.1# make install
    .....
    +--------------------------------------------------------+
    | 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         |
    | (initially created or preserved) configuration files   |
    |                                                        |
    |   /www/etc/apache/{httpd,access,srm}.conf
    |                                                        |
    | and then you should be able to immediately fire up     |
    | Apache the first time by running:                      |
    |                                                        |
    |   /www/sbin/apachectl start
    |                                                        |
    | Thanks for using Apache.       The Apache Group        |
    |                                http://www.apache.org/  |
    +--------------------------------------------------------+
    server1:/usr/local/etc/apache_1.3.1# cd ../php-3.0.2a
    server1:/usr/local/etc/php-3.0.2a# cp php3.ini-dist /usr/local/lib/php3.ini
        

    /www 配下は以下のようになりました。

    server1:/usr/local/etc/apache_1.3.1# ls /www
    bin/      etc/      include/  libexec/  man/      sbin/     share/    var/
        
  7. 設定

    Apache はだいぶおりこうになって、 デフォルトの設定ファイルをすべて用意してくれるようになりました。 変更したところは、/www/etc/apache/srm.conf に

    AddType application/x-httpd-php3 .php3
        
    を1行加えたのと、/www/etc/apache/httpd.conf の Group に引数が なかったので #-1 を加えただけです。では、起動してみましょう。 起動の仕方もすっかり変わってしまいました。

  8. 起動
    server1:/www/etc/apache# /www/sbin/apachectl start  
        

    一応うまく動いたようです。が、Apache のディレクトリ構造 が全く変わってしまっていて、面食らってしまいました。

  9. 注意

    http://サーバ/~ユーザ名/
    形式のアクセスで、「Forbidden」になってしまい、ちょっと悩みました。 /home/ユーザ名/public_html 配下に今までの *.php を全部コピー したんだけどなあ。ディレクトリのパーミッションも合ってるし。

    原因は、index.php3 はあるけど index.html がないことでした。

    http://サーバ/~ユーザ名/index.php3
    と明示的に指定すれば表示できました。やれやれ。

  10. ディレクトリ構造

    以下のようになっています

    ディレクトリファイル名説明
    /www:bin:
    dbmmanage*ユーザ認証ファイル(DBMフォーマット)保守
    htdigest*ユーザ認証ファイル保守
    htpasswd*ユーザ認証ファイル保守
    etc:apache:
    access.confアクセス制御設定ファイル
    access.conf.defaultaccess.conf と同じ
    httpd.confサーバ設定ファイル
    httpd.conf.defaulthttpd.conf と同じ
    magic.confmod_mime_magic用 magic データ設定ファイル
    magic.conf.defaultmagic.conf と同じ
    mime.typesファイル拡張子と MIME タイプ対応設定ファイル
    mime.types.defaultmime.types と同じ
    srm.conf名前空間設定ファイル
    srm.conf.defaultsrm.conf と同じ
    include:apache:*.h各種ヘッダファイル
    libexec:(空)
    man:man1*.1マニュアルページ
    man8*.8マニュアルページ
    sbin:abApache ベンチマーク・ツール
    apachectlApache サーバ制御インターフェース
    apxs拡張モジュールのインストーラ
    httpdWeb サーバ本体
    logresolveログファイルにおけるホスト名解決
    rotatelogsログファイルのサイクリック使用
    shareapachecgi-bin*cgi スクリプト
    htdocs*.htmlHTML サンプル(It Worked!)
    icons*.gif各種アイコン
    varapachelogaccess_logアクセスログ
    error_logエラーログ
    proxy(空)
    runhttpd.lock.数字ロックファイル
    httpd.pidpid ファイル

  11. PHP3 の動作確認

    まず、デフォルトの拡張子が phtml から php3 になったので、 ファイル名の変更を行います。で、動かしてみますが、 文法が変わっているので当然動かない、と。

    けっこうな量のコードをすでに書いてしまっているので、 自動変換ツールなるものに挑戦しました。

    php-3.0.2a/convertor/README 抄訳
    PHP/FI 2.0 -> PHP 3.0 コンバータ
    こいつは何をしてくれるんでしょう?
      

    こいつは PHP/FI 2.0 のスクリプトを、うまいこと PHP 3.0 に 変換してくれます。というのはちょっと大袈裟かな?多くの場合、 (まだ)やってくれない事と、決してやってくれないことがあります。 PHP/FI 2.0 と PHP 3.0 に関する非互換性については、 CHANGES を見てください。

    現在、このコンバータは以下の事をやります。

    • 終了 PHP タグを > から ?> にする。

    • セミコロンをコロンにする。

      • while(); .. endwhile; => while(): .. endwhile;
      • if(); .. elseif(); .. else; .. endif; => if(): .. elseif(): .. else: .. endif;
      • switch(); .. endswitch; => switch(): .. endswitch;
      これに加え、case と default の後のセミコロンをコロンに変換します。 PHP 3.0 では両方サポートしてるんですけどね。コロンの方がいいと されているから。
    • 'function' という言葉を 'old_function' に変換します。 これでユーザ定義関数も動くでしょう。
      関数を PHP 3.0 スタイルには変えてくれません。でも、 'function' という言葉を変える事によって、PHP 3.0 は PHP/FI 2.0 スタイルの関数を認識してくれます。

    あまり多くの機能を盛り込みたくはないので、このコンバータは これ以上のことはやってくれません。単に、PHP/FI 2.0 のスクリプトを PHP 3.0 に移行するための早道を提供するだけです。たぶんいろんな トラブルを避けるためにも、この変換をかけた後も、コードを いろいろといじくり回さなければならないでしょう。

    インストール
      単に 'make' とやるだけ。
    使い方
      

    script.phtml という名前の PHP/FI 2.0 スクリプトを script.php3 という名前の PHP 3.0 スクリプトに変換するには、 以下のようにやります。

    ./convertor < script.phtml > script.php3

    もしちゃんと動いたら、何もメッセージも出ず、変換された script.php3 スクリプトが出来上がります。(でも、前に述べたように、 コンバータがサポートしない違いもあるので、PHP 3.0 配下で 動かす前にちいとばかり修正してやらなくてはなりません。)

    'parse error' と言われたら、以下のうちのどれかです。

    1. コンバータにバグがあった。
    2. バグ付きスクリプトが PHP/FI 2.0 で動いていて、たまたま PHP/FI 2.0 の文法ではそれを検知しなかったんだけど、 コンバータは検知してしまった(後述)。

    いずれの場合も php-dev@php.iquest.net に報告してください。 問題となったスクリプトも付けてくださいね。

    これらのことはあまり起こらないとは思うんですが、サンプルで やっているときに出た事はあります。このコンバータは PHP 3.0 の パーサを元に、PHP/FI 2.0 言語を理解するように変更を加えて、 変換されたスクリプトを吐くようにしたものです。PHP/FI 2.0 の パーサと PHP 3.0 のそれが違うんで、変更された PHP 3.0 パーサ が認識する言語はちゃんと定義されているんですが、実装する時に 抜けがあったかもしれません。このコンバータは、 PHP/FI 2.0 そのものよりも、ちゃんと PHP/FI 2.0 言語を認識するかも しれません。

    で、さっそくバイナリを作って実行してみたら、ぬわんと プロンプトに戻って来ません。追っかける気力もないので、 動いた人誰か教えてください(;_;)。....

    と言って大騒ぎしいていたら、リダイレクトでファイル名を 渡さずに引数で指定してました(^^;。浦栃@筑波大さん、ありがとう ございました。うーん、初心忘るべからず、ですな。

    一部 converter が parse error となったり core を吐くような こともありましたが、無事なんとか *.phtml → *.php3 への 変換は完了しました。ちなみに parse error になったのは 文字コードが JIS だったものと、もともと文法エラーがあったのに PHP/FI では検出できていなかったというパターン。 core を吐いたのは、/* ... */ が複数行に跨っていたパターンでした。

  12. 移行

    では、いよいよ動かしてみます。引っかかったところを随時 メモしていきます。

    移行作業のポイント
    エラー原因対処
    hoge.phtml がない 拡張子が変わった hoge.php3 に変更する
    setshowinfo() がない なくなった? コメントアウト。
    フッタ表示を抑制するために入れていたものでしたが、 これがなくても出なくなりました。
    $a = "ABC" + "DEF" が 0 になる。 文字列の連結は '.'(ドット) に変わった 実行しながら逐次 '.' に変更
    $a[] = 配列を返す関数() で、$a[0] が 'Array' となる。 多次元配列のサポートに伴い、配列の扱いが変わった。 $a = 配列を返す関数() とすれば OK でした。
    ';'(セミコロン)のみの実行行を許さない。 文法チェックが厳密になった影響でしょう もともと読みやすさのために入れておいたロジックなので、 ばっさり削除。