Web aym.pekori.to

第 53章インストール

このセクションでは PHP のインストール方法に関する一般的な質問を扱います。 PHP は(OSX 以前の MacOS を除けば)、ほとんど全ての OS とウェブサーバで 利用可能です。

PHP をインストールするには、パートIIPHP マニュアル の指示に従ってください。

1. なぜ、Apache 2 のマルチスレッド MPM モードを実運用環境で使用するべきではないのですか?
2. Unix/Windows: php.ini ファイルはどこに置けばよいのですか?
3. Unix: PHP をインストールしましたが、ファイルをロードするたびに 'Document Contains No Data(ページが表示できません)' という メッセージが表示されます。何が起こっているのですか?
4. Unix: RPM を使って PHP をインストールしたのですが、Apache が PHP のページを 処理してくれません。何が起こっているのですか?
5. Unix: PHP 3 を RPM を使ってインストールしたのですが、その RPM は 私が必要とするデータベースのサポートなしでコンパイルされたものでした。 どうすればよいですか?
6. Unix: Apache に FrontPage エクステンションのパッチを当てたら、突然 PHP が動作しなくなってしまいました。PHP は Apache の FrontPage エクステンションと共存することはできないのですか?
7. Unix/Windows: PHP をインストールしたのですがブラウザから PHP スクリプトにアクセスしても何も表示されません。
8. Unix/Windows: PHP をインストールしたのですがブラウザから PHP スクリプトにアクセスすると Internal Server Error 500 となってしまいます。
9. PHP をインストールするまではエラーもなく問題なく進んだのですが、 apache を起動させようとすると undefined symbol エラーが発生します。
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress
10. Windows: PHP をインストールしたのですがブラウザから PHP スクリプト にアクセスすると次のようなエラーが出力されます。
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:
11. Windows: 全ての説明に従っているのに PHP が IIS で動作しません!
12. IIS, PWS, OmniHTTPD, Xitami上でCGIとしてPHPを実行するとき、 次のようなエラーが出る:Security Alert! PHP CGI cannot be accessed directly.
13. php.ini が認識され読み込まれていることをどうやって知ることが できますか? 自分の行った変更が反映されてないらしいのですが。
14. Windows で PHP のディレクトリを PATH に追加するにはどうすればいいのですか?
15. Windows 上の PHP で、php.ini を使えるようにするにはどうしたらいいのですか?
16. Apache のコンテントネゴシエーション(MultiViews オプション)を PHP で使用することはできますか?
17. PHP が処理できるリクエストメソッドは GET および POST だけなのですか?

1. なぜ、Apache 2 のマルチスレッド MPM モードを実運用環境で使用するべきではないのですか?

PHP はグルー(糊)です。このグルーは、多くのサードパーティ製のライブラリを くっつけることによりクールな Web アプリケーションを構築するために使用され、 直観的で簡単に習得できる言語インターフェイスにより、一つの整合性のある実体として 見せることができます。 PHP の柔軟性と力は、プラットフォームの安定性と堅牢性に基づいています。 グルーによる結合をするためには、OS や Web サーバ、サードパーティ製のライブラリを 必要とします。 これらの一つの機能が停止した場合、PHP は問題を特定し、速やかに修正する 手段を必要とします。 実行スレッドを完全に分離しなかったり、 メモリセグメントを完全に分離しなかったり、 各リクエストで使用される強力なサンドボックスを有さないことで、 基本的なフレームワークをより複雑なものにした場合、 PHP のシステムに弱点が生まれます。

マルチスレッド MPM を使用する必要がある場合、 PHP が自分のメモリ空間で実行される FastCGI 設定を観てみてください。

最後に、この警告はマルチスレッド MPM の使用に対するものですが、 Windows システムではより多くのライブラリがスレッドセーフである傾向が あるため、この警告の度合はより弱くなります。

2. Unix/Windows: php.ini ファイルはどこに置けばよいのですか?

UNIX の場合、デフォルトでは /usr/local/lib です。コンパイル時に --with-config-file-path オプションを使用してこの場所を変えたいという人も多いでしょう。 例えばこのようにすることも出来ます:
--with-config-file-path=/etc
そしてディストリビューションの php.ini-dist/etc/php.ini にコピーし、環境に合うように 編集してください。

--with-config-file-scan-dir=PATH

Windows の場合、php.ini のデフォルトパスは Windows ディレクトリになります。 Apache ウェブサーバを使っている場合はまず Apache がインストールされているディレクトリ (例えば c:\program files\apache group\apache にある php.ini を探そうとします。このため、異なる php.ini ファイルを異なるバージョンの Apache ごとに置いておくことができます。

設定ファイルの章も参照してください。

3. Unix: PHP をインストールしましたが、ファイルをロードするたびに 'Document Contains No Data(ページが表示できません)' という メッセージが表示されます。何が起こっているのですか?

これはおそらく PHP に何らかの問題が起こっていてコアダンプしている という状態です。サーバのエラーログを見てこのケースかどうかチェック してください。そして小さなテストケースで問題を再現させてみてください。 もし 'gdb' の使い方が分かるならバグレポートに加えてバックトレースを 提供してもらえると開発者が問題の箇所を突き止めるのに 非常に役立ちます。もしあなたがPHPをApacheモジュールとして使用している 場合は以下のようにします:

  • httpd を停止します

  • gdb httpd

  • Stop your httpd processes

  • > run -X -f /path/to/httpd.conf

  • ブラウザから問題のある URL にアクセスします

  • > run -X -f /path/to/httpd.conf

  • もしコアダンプが発生すると gdb が知らせてくれます

  • bt とタイプします

  • このバックトレースをバグレポートに含めてください。バグレポートは http://bugs.php.net/ から送信してください。

もしそのスクリプトが正規表現関数を使用している場合 (ereg()やその類似関数)、PHP と Apache が同じ正規表現の パッケージを使用してコンパイルされているかどうかを確認してください。 PHP と Apache 1.3.x を使用している場合は常に確認が必要です。

4. Unix: RPM を使って PHP をインストールしたのですが、Apache が PHP のページを 処理してくれません。何が起こっているのですか?

あなたが Apache と PHP の両方を RPM でインストールしたとすると、以下に示す 内容の一部もしくは全てを httpd.conf ファイルに追加するか、コメントを 外す必要があります:
# Extra Modules
AddModule mod_php.c
AddModule mod_php3.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php3_module        modules/libphp3.so     # for PHP 3
LoadModule php4_module        modules/libphp4.so     # for PHP 4
LoadModule perl_module        modules/libperl.so
そして以下の行:
AddType application/x-httpd-php3 .php3    /* for PHP 3 */
AddType application/x-httpd-php .php      /* for PHP 4 */
以上の内容を全体設定、もしくは PHP サポートを追加したいバーチャル ドメインの設定に加えてください。

5. Unix: PHP 3 を RPM を使ってインストールしたのですが、その RPM は 私が必要とするデータベースのサポートなしでコンパイルされたものでした。 どうすればよいですか?

PHP 3 のビルド方法の制約により、どの環境にも対応できる柔軟な PHP の RPM を作成するのは困難です。この問題に関しては PHP 4 で取り組んでいます。 PHP 3 ではとりあえず PHP ディストリビューションの INSTALL.REDHAT ファイルで説明されている方法を用いることをお勧めします。 もしどうしても RPM バージョンの PHP 3 を使う、という場合は続きをお読みください。

RPM のパッケージャはインストール処理を単純化するため、 そして標準の /usr/local/ ディレクトリではなく /usr/ を使用するためにデータベースサポート無しの RPM を作成しています。 データベースサポートを追加するには RPM spec ファイルにサポートする データベースの種類と最上位ディレクトリを指定する必要があります。

以下の例は広く使われている MySQL データベースサポートを追加して Apache モジュールをインストールする場合について説明しています。

もちろん以下の全ての情報は PHP がサポートするいずれのデータベース の場合でも対象箇所を適宜変更すれば対応可能です。この場合は MySQL と Apache 共に RPM のみを使ってインストールしたものと仮定しています。

  • まず mod_php3 を削除します。
    rpm -e mod_php3

  • ソース RPM を手に入れてインストールします。--rebuild ではありません。
    rpm -Uvh mod_php3-3.0.5-2.src.rpm

  • /usr/src/redhat/SPECS/mod_php3.spec を編集します。

    %build セクションに追加するデータベースサポートとそのパスを記述します。

    MySQL の場合は以下のようになります。 --with-mysql=/usr %build セクションはこのようになります。
    ./configure --prefix=/usr \
    --with-apxs=/usr/sbin/apxs \
    --with-config-file-path=/usr/lib \
    --enable-debug=no \
    --enable-safe-mode \
    --with-exec-dir=/usr/bin \
    --with-mysql=/usr \
    --with-system-regex

  • 変更が終了したら以下のようにしてバイナリ RPM を構築します。
    rpm -bb /usr/src/redhat/SPECS/mod_php3.spec

  • インストールします。
    rpm -ivh /usr/src/redhat/RPMS/i386/mod_php3-3.0.5-2.i386.rpm

Apache を再起動するのを忘れないでください。そうすれば PHP 3 には MySQL サポートが追加されているはずです。ただ、ディストリビューションの tar ファイルから構築してそこに含まれる INSTALL.REDHAT ファイルにしたがった方が おそらくずっと簡単である、ということも忘れないでください。

6. Unix: Apache に FrontPage エクステンションのパッチを当てたら、突然 PHP が動作しなくなってしまいました。PHP は Apache の FrontPage エクステンションと共存することはできないのですか?

いいえ。PHP は FrontPage エクステンションと問題なく共存できます。 問題は FrontPage エクステンションのパッチが PHP が依存している Apache の 構造の一部を変更してしまうことにあります。パッチを当てた後で PHP を再コンパイル('make clean; make' としてください)すれば問題は 解決されます。

7. Unix/Windows: PHP をインストールしたのですがブラウザから PHP スクリプトにアクセスしても何も表示されません。

ブラウザの「ソースの表示」を実行してください。おそらく PHP の ソースコードが表示されると思います。これはウェブサーバがスクリプトを PHP に渡していないためスクリプトが実行されていない、ということを 意味します。サーバ側の設定のどこかが間違っているはずですので、 PHP インストールマニュアルに従って再度入念に設定を確認してみてください。

8. Unix/Windows: PHP をインストールしたのですがブラウザから PHP スクリプトにアクセスすると Internal Server Error 500 となってしまいます。

ウェブサーバが PHP を実行するときに何らかの問題が起きています。 どんなエラーが起こっているか確認するために、コマンドラインで PHP 実行ファイル(Windows では php.exe) のある ディレクトリに移動して php -i を実行してください。 もし PHP の実行時に問題があった場合は適切なエラーメッセージが表示されるので、 それを手がかりに次に何をすべきかを知ることができます。画面 一杯に HTML(phpinfo() 関数の出力)が表示された場合には PHP は問題なく動作していますので、問題はウェブサーバの設定 にあるはずです。再度入念にチェックしてみてください。

9. PHP をインストールするまではエラーもなく問題なく進んだのですが、 apache を起動させようとすると undefined symbol エラーが発生します。
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

これは、PHP とは関係なく MySQL クライアントライブラリの問題です。 このライブラリのうちある種のものは --with-zlib を必要とし、 他のものは必要としません。この問題は MySQL FAQ でも扱われています。

10. Windows: PHP をインストールしたのですがブラウザから PHP スクリプト にアクセスすると次のようなエラーが出力されます。
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

このエラーメッセージは PHP が(何らかの理由で)何も出力できなかった ことを意味します。詳細なエラーメッセージを得るためには、 コマンドラインから PHP 実行ファイル(Windows では php.exe)のあるディレクトリに移動して php -i を実行してください。もし PHP の実行時に問題 があった場合は適切なエラーメッセージが表示されるのでそれを 手がかりに次に何をすべきかを知ることができます。画面一杯に HTML (phpinfo()関数の出力) が表示された場合には PHP は問題なく動作しています。

PHP がコマンドラインで動作したなら、再度ブラウザから PHP スクリプトに アクセスしてみてください。もしまだ失敗するようなら以下のいずれかの 理由によるものと思われます。

  • PHP スクリプト、 php.exephp4ts.dllphp.ini もしくはロードしようとしている PHP 拡張モジュールの ファイルパーミッションが匿名インターネットユーザ IUSER_<machinename> にアクセスできない ものになっている。

  • スクリプトが存在しない(もしくはあなたが在ると思っている場所と ウェブサーバのルートディレクトリからの相対位置がずれている)。 IIS を使用している場合は、Internet Service Manager でスクリプト マッピングを設定するときに「ファイルの存在を確認する」にチェックを することでこのエラーをトラップすることができます。もしスクリプト ファイルが存在しない場合はサーバが代わりに 404 エラーを返すように なります。これにはもう一つ利点があります。それは IIS が スクリプトファイルの NTLanMan パーミッションに応じて認証を要求する ようになる、ということです。

11. Windows: 全ての説明に従っているのに PHP が IIS で動作しません!

PHP スクリプトを実行しようとするあらゆるユーザが php.exe の実行権限を必要としているということを 忘れないでください。IIS はインストール時に追加された匿名ユーザを使用 します。このユーザに対して php.exe の実行権限が 必要です。また、認証された全てのユーザに関しても php.exe の実行権限が必要です。IIS4 の場合はさらに PHP がスクリプトエンジンであるということを教えてやる必要があります。 この FAQ も読んでください。

12. IIS, PWS, OmniHTTPD, Xitami上でCGIとしてPHPを実行するとき、 次のようなエラーが出る:Security Alert! PHP CGI cannot be accessed directly.

cgi.force_redirect0 をセットしてください。デフォルトでは 1 にセットされていますので、そのディレクティブが ; でコメントアウトされていないことを確認してください。 他のディレクティブと同様にこれは php.ini 上でセットされます。

デフォルトは 1 なので、100% 正しく php.ini ファイルが 読み込まれているかどうかが重要です。 詳細はこの FAQ を 読んでください。

13. php.ini が認識され読み込まれていることをどうやって知ることが できますか? 自分の行った変更が反映されてないらしいのですが。

php.ini とそれが PHP に読み込まれているかを確認するには phpinfo() をコールして最初のほうに 表示されている Configuration File (php.ini) を見てください。これは PHP が認識している php.ini と、それが 読み込まれているか否かを示しています。ディレクトリパスだけが 表示されている場合は、読み込まれていないということなので、 そのディレクトリに php.ini を置いてください。 php.ini が PATH にある場合それが読み込まれます。

php.ini が読み込まれていてかつ PHP をモジュールとして実行 している場合、php.ini を変更した後で必ず Web サーバを 再起動してください。

14. Windows で PHP のディレクトリを PATH に追加するにはどうすればいいのですか?

Windows NT、2000、XP および 2003 では、

  • コントロールパネルのシステムアイコンを選択します(スタート -> 設定 -> コントロールパネル -> システム、あるいは Windows XP/2003 では 単に スタート -> コントロールパネル -> システム)。

  • 詳細設定タブに移動します。

  • 「環境変数」ボタンを押します。

  • 「システム環境変数」欄を見ます。

  • Path というエントリを見つけます(スクロールする必要があるかもしれません)。

  • Path のエントリをダブルクリックします。

  • その最後に ';' と追加し、その後に PHP のディレクトリを追加します (例: ;C:\php)。

  • OK を押し、コンピュータを再起動します。

Windows 98/Me では、autoexec.bat を編集する必要があります。

  • メモ帳を開きます(スタート -> ファイル名を指定して実行 で、 notepad と入力します)。

  • C:\autoexec.bat ファイルを開きます。

  • PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;..... という行を探し、 その行の最後に ;C:\php を追加します。

  • ファイルを保存し、コンピュータを再起動します。

注意: 上の作業を行った後は、必ずコンピュータを再起動し、 PATH の変更が適用されていることを確認しましょう。

PHP マニュアルでは、これまでファイルを Windows のシステムディレクトリに コピーするよう推奨してきました。なぜなら、このディレクトリ (C:\WindowsC:\WINNT、など) にはデフォルトでシステムの PATH が通っていたからです。ファイルを Windows のシステムディレクトリにコピーすることはずいぶん昔に非推奨と なっており、これはさまざまな問題のもととなりえます。

15. Windows 上の PHP で、php.ini を使えるようにするにはどうしたらいいのですか?

いくつかの方法があります。Apache を使用しているのなら、Apache 固有のインストール手順(Apache 1Apache 2)を参照ください。 それ以外の場合は、環境変数 PHPRC を指定する 必要があります。

Windows NT、2000、XP および 2003 では、

  • コントロールパネルのシステムアイコンを選択します(スタート -> 設定 -> コントロールパネル -> システム、あるいは Windows XP/2003 では 単に スタート -> コントロールパネル -> システム)。

  • 詳細設定タブに移動します。

  • 「環境変数」ボタンを押します。

  • 「システム環境変数」欄を見ます。

  • 「新規」ボタンを押し、変数名に 'PHPRC' 、変数値に php.ini の 存在するディレクトリ(例: C:\php)を入力します。

  • OK を押し、コンピュータを再起動します。

Windows 98/Me では、autoexec.bat を編集する必要があります。

  • メモ帳を開きます(スタート -> ファイル名を指定して実行 で、 notepad と入力します)。

  • C:\autoexec.bat ファイルを開きます。

  • ファイルの最後に以下の内容の行を追加します。set PHPRC=C:\phpC:\php を、実際に php.ini が存在するディレクトリに置き換えます)。パスには空白文字を 含められないことに注意しましょう。たとえば、もし PHP を C:\Program Files\PHP にインストールしたのなら、 その代わりに C:\PROGRA~1\PHP と入力する必要が あります。

  • ファイルを保存し、コンピュータを再起動します。

16. Apache のコンテントネゴシエーション(MultiViews オプション)を PHP で使用することはできますか?

もしリンクする PHP ファイルが拡張子を持っているなら、すべては うまく動作します。この FAQ が対象としているのは、リンクする PHP ファイルが拡張子を持っておらず、拡張子のない URL から PHP ファイルを判別するためにコンテントネゴシエーションを使用する方法です。 この場合、AddType application/x-httpd-php .php という行を以下のように変更します。
# PHP 4
AddHandler php-script php
AddType text/html php

# PHP 5
AddHandler php5-script php
AddType text/html php
この方法は、Apache 1 ではうまく動作しません。なぜなら PHP モジュールが php-script をキャッチできないからです。

17. PHP が処理できるリクエストメソッドは GET および POST だけなのですか?

いいえ、それ以外のいかなるメソッド(例: CONNECT)でも扱えます。 適切な応答ステータスは、header() を使用して送信可能です。 GET および POST だけを処理したいなら、Apache の設定を以下のようにします。
<LimitExcept GET POST>
Deny from all
</LimitExcept>