PHP 4.3.5インストール

 PHPは、HTML埋め込み形のサーバサイド・スクリプト言語である。WindowsNT系のサーバサイド・スクリプト言語ではASPが有名だが、ASPのLinux版と考えていいだろう。ASPはIIS上で動作し、PHPはApache上で動作する。
 PHPは、様々なデータベースに接続し、WebDBを容易に実現できる。LinuxでWebサーバの公開と、データベースを利用しているなら、是非PHPを利用し、WebDBシステムを作ってみてほしい。

 インストールはrootユーザで行う。

1.インストール

1-1ソースファイルの展開

 /usr/local/srcなどにPHP4のソース・ファイルをコピーし、次のように展開する。

# cd /usr/local/src
# tar zxvf php-4.3.5.tar.gz

1-2 configureスクリプトの実行

 展開してできたソース・ディレクトリに移動し、configureスクリプトを実行(PostgreSQLがインストールされているものとする)。

Apache 1.3.xへインストールする場合

# cd php-4.3.5
# ./configure --with-apxs=/usr/local/apache/bin/apxs --with-pgsql=/usr/local/pgsql --with-sigchild --enable-mbstring --enable-mbregex --enable-zend-multibyte --without-mysql

Apache 2.0.xへインストールする場合

# cd php-4.3.5
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pgsql=/usr/local/pgsql --with-sigchild --enable-mbstring --enable-mbregex --enable-zend-multibyte --without-mysql

※Apache1.3.xとApache2.0.xではapxsの指定が違うことに注意!!
※PHP4.3から --enable-mbstr-enc-trans が廃止になった。

1-3 コンパイル、インストール

 configureが無事終了したら、コンパイル、インストールを行う。

# make
# make install

1-4 php.iniの設定

 インストール終了後、PHP4の設定ファイルをコピーする。

# cp php.ini-dist /usr/local/lib/php.ini

2.PostgreSQL用共有ライブラリの設定

 WebからPHPを利用してPostgreSQLのデータベースにアクセスさせる場合は、PostgreSQLのアクセス用関数で使用する共有ライブラリ(libpq)の設定を行う。

# vi /etc/ld.so.conf

 ファイルの最後に次の2行を追加し、保存する。

# /usr/local/lib
# /usr/local/pgsql/lib

 修正を反映させるため、ldconfigを再起動する。

# /sbin/ldconfig

3.Apacheの設定

 Apache上でPHPが使えるよう、httpd.confファイルを設定する。

Apache 1.3.xの場合

# vi /usr/local/apache/conf/httpd.conf

Apache 2.0.xの場合

# vi /usr/local/apache2/conf/httpd.conf

3-1 モジュールの設定

 以前試したPHP 4.3.1ではApache2.0.xへインストールした場合、何故かAddModuleにlibphp4.soが追加されなかった。よって、自分で入れなければならない。

# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule php4_module modules/libphp4.so

 しかし、今回のバージョンではちゃんと入っているようだ。何がいけなかったんだろう・・・

3-2 その他の設定

 PHP4スクリプトファイル(拡張子が.php)をPHP4スクリプトだと認識させるため、AddHandler cgi-script .cgiという行の上あたりに以下の行を追加する。

#
# To use PHP scripts:
#
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
←任意

 次に、index.phpというファイルがデフォルトページとして使えるよう、DirectoryIndexの設定を次のように修正する。(任意)

<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>

3-3 再起動

 設定を反映させるため、Apacheを再起動する。

# /etc/rc.d/init.d/httpd stop
# /etc/rc.d/init.d/httpd start

4.動作確認

4-1 ApacheからPHPが使えるかどうかを確認する

 phpinfo.phpというファイルを以下の内容で作成し、クライアントからブラウズする。

<?php phpinfo(); ?>

 「PHP Version 4.3.4」という表が出てきたらOK。「<?php phpinfo(); ?>」という文字列が表示されたら、PHPコマンドとして認識されていないことになるので、Apacheの設定などを見直す。

4-2 PHPからPostgreSQLデータベースのテーブルが利用できるかを確認する

 PostgreSQLデータベース上の任意のテーブルが、PHPから検索できるかを確認する。select_tbl.phpというファイルを以下の内容で作成し、クライアントからブラウズする。
(※赤字のところは自分の環境に合わせて編集する)

<?php
  $db_host = "ホスト名またはIPアドレス";
  $db_port = "5432";
  $db_name = "データベース名";
?>
<HTML>
<HEAD><TITLE></TITLE></HEAD>
<BODY>
<?php
  $con = pg_connect("host=$db_host port=$db_port dbname=$db_name");
  if ($con == false)
  {
     echo "接続エラー!\n";
     exit;
  }

  $tbl_name = "テーブル名";
  $sql = "SELECT * FROM $tbl_name";
  $result = pg_exec($con, $sql);
  if ($result == false)
  {
    echo "SQLエラー!\n";
    exit;
  }

  $rows = pg_NumRows($result);

  for ($i = 0;$i < $rows; $i++)
  {
    echo pg_Result($result, $i, 1);
    echo "<BR>\n";
  }

  pg_FreeResult($result);
  pg_Close($con);
?>
</BODY>
</HTML>

 エラーメッセージが出ずに、指定した表の1列目のデータが表示されればOK!

 ※ここで指定するテーブル名は、nobodyユーザがselect権限を持つテーブルでなければならない。

5.旧バージョンとの違いと対応について

 PHP 4.2.0より、php.iniのregister_globalsパラメータのデフォルトがOffになり、フォーム変数が $変数名 でアクセスすることができなくなった。これにより、例えばリストボックスの値によって処理を振り分けたり、ベーシック認証などで認証したユーザ名によって表示項目を変えるなどの処理を行っていたプログラムが、すべて機能しなくなる。
 例えば、次のようなプログラムがあったとする。

例1)フォームで入力した値を元に、メッセージを変える

<FORM action="<?php echo $PHP_SELF?>" method="POST">
    <INPUT type="text" name="nenrei"><INPUT type="SUBMIT" value="実行">
</FORM>
<?php
    if ($nenrei >= 18)
        print("18歳以上です");
    else
        print("18歳未満です");
?>

例2)ユーザ認証で使用したユーザ名を利用する

<?php
    if ($REMOTE_USER == "webmaster")
        print("管理者ユーザです");
    else
        print("一般ユーザです");
?>

 PHP 4.2.0より以前のバージョンであれば、問題なく使えるプログラムであるが、PHP 4.2.0以降では、このプログラムでは$REMOTE_USERが使えなくなり、すべてelseの処理になってしまう。
 これを解決するには、2つの方法がある。

方法1:php.iniの設定を変える

 PHPの設定ファイルである「php.ini」のパラメータ「register_globals」の値がOffになってしまったために、今まで動いていたプログラムが動かなくなったのである。なので、このパラメータを従来どおり「On」に設定してApacheを再起動すれば、今までのプログラムは問題なく動くようになる。

方法2:プログラムを修正する

 register_globalsパラメータの値がOffになったのは、セキュリティーの脆弱性をある程度解決するためである。であれば、このパラメータはOffにしたままでプログラムが動くように修正するべきである。
 PHP 4.1.0より、スーパーグローバル変数というものが追加された。スーパーグローバル変数は通常の変数と異なり、global宣言をすることなく参照できる。

【スーパーグローバル変数(抜粋)】

変数名従来の名前使いかた
$_SERVER$HTTP_SERVER_VARS実行環境情報などを保持する
$_ENV$HTTP_ENV_VARS環境変数
$_POST$HTTP_POST_VARSHTTP POSTメソッドで与えられた変数
$_GET$HTTP_GET_VARSHTTP GETメソッドで与えられた変数
$_COOKIE$HTTP_COOKIE_VARSHTTPクッキーを通じて与えられた変数
$_SERVER
従来、環境周りの情報を取得するために使用していた $PHP_SELF、$REMOTE_ADDRなどが、すべて $_SERVER[ ]にまとめられた。
$_SERVER['PHP_SELF'] のように使う。
$_ENV
PHP実行時の環境変数(getenv()で取得できるもの)を保持している。PHPがDSOで組み込まれている場合は、サーバの実行時の環境変数となる。
$_POST、$_GET
HTMLフォームのMETHODでPOSTを指定した場合、スクリプト側は $_POST['変数名'] で入力を受け取る。METHODでGETを指定、または何も指定しなかった場合、およびURLに ?変数名=値 で渡された引数については $_GET['変数名7] で受け取る。
$_COOKIE
クライアントからクッキーで送り込まれた値を保持する。

 これらを利用すると、例題のプログラムは次のように修正できる。

例1)フォームで入力した値を元に、メッセージを変える:修正版

<FORM action="<?php echo $_SERVER['PHP_SELF']?>" method="POST">
    <INPUT type="text" name="nenrei"><INPUT type="SUBMIT" value="実行">
</FORM>
<?php
    if ($_POST['nenrei'] >= 18)
        print("18歳以上です");
    else
        print("18歳未満です");
?>

例2)ユーザ認証で使用したユーザ名を利用する:修正版

<?php
    if ($_SERVER['REMOTE_USER'] == "webmaster")
        print("管理者ユーザです");
    else
        print("一般ユーザです");
?>

補足?

 しかし、旧バージョンのやり方でプログラムを数多く作っている場合、修正が大変である。なので、とりあえずregister_globalsパラメータをOnに設定して、すべてのプログラムが正常に動作することを確認して動かしておき、少しずつ新しい命令に修正していき、すべての修正が終わったらパラメータをOffに設定すればいいんじゃないか・・・と私は思う。


[ TOP ]