このセクションでは PHP のインストール方法に関する一般的な質問を扱います。
PHP は、ほとんど全ての OS とウェブサーバーで
利用可能です。
-
なぜ、Apache 2 のマルチスレッド MPM モードを実運用環境で使用するべきではないのですか?
-
PHP はグルー(糊)です。このグルーは、多くのサードパーティ製のライブラリを
くっつけることによりクールな Web アプリケーションを構築するために使用され、
直観的で簡単に習得できる言語インターフェイスにより、一つの整合性のある実体として
見せることができます。
PHP の柔軟性と力は、プラットフォームの安定性と堅牢性に基づいています。
グルーによる結合をするためには、OS や Web サーバー、サードパーティ製のライブラリが必要です。
これらの一つの機能が停止した場合、PHP は問題を特定し、速やかに修正する
手段が必要です。
実行スレッドを完全に分離しなかったり、
メモリセグメントを完全に分離しなかったり、
各リクエストで使用される強力なサンドボックスを有さないことで、
基本的なフレームワークをより複雑なものにした場合、
PHP のシステムに弱点が生まれます。
マルチスレッド MPM を使いたい場合は、
PHP が自分のメモリ空間で実行される FastCGI の設定をみてください。
-
Unix/Windows: php.ini ファイルはどこに置けばよいのですか?
-
UNIX の場合、デフォルトでは /usr/local/lib
です。コンパイル時に
--with-config-file-path
オプションを使用してこの場所を変えたいという人も多いでしょう。
例えばこのようにすることも出来ます:
--with-config-file-path=/etc
そしてディストリビューションの php.ini-development
を /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 ごとに置いておくことができます。
設定ファイルの章も参照ください。
-
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 とタイプします
-
このバックトレースをバグレポートに含めてください。バグレポートは
» https://github.com/php/php-src/issues
から送信してください。
もしそのスクリプトが正規表現関数
(preg_match やその類似関数) を使用している場合、
PHP と Apache が同じ正規表現のパッケージを使用してコンパイルされているかどうかを確認してください。
PHP と Apache 1.3.x を使用している場合は常に確認が必要です。
-
Unix: RPM を使って PHP をインストールしたのですが、Apache が PHP のページを
処理してくれません。何が起こっているのですか?
-
あなたが Apache と PHP の両方を RPM でインストールしたとすると、以下に示す
内容の一部もしくは全てを httpd.conf ファイルに追加するか、コメントを
外す必要があります:
# Extra Modules
AddModule mod_php.c
AddModule mod_perl.c
# Extra Modules
LoadModule php_module modules/mod_php.so
LoadModule php5_module modules/libphp5.so
LoadModule perl_module modules/libperl.so
そして以下の行:
AddType application/x-httpd-php .php
以上の内容を全体設定、もしくは PHP サポートを追加したいバーチャル
ドメインの設定に加えてください。
-
Unix: Apache に FrontPage 拡張モジュールのパッチを当てたら、突然
PHP が動作しなくなってしまいました。PHP は Apache の FrontPage
拡張モジュールと共存することはできないのですか?
-
いいえ。PHP は FrontPage 拡張モジュールと問題なく共存できます。
問題は FrontPage 拡張モジュールのパッチが PHP が依存している Apache の
構造の一部を変更してしまうことにあります。パッチを当てた後で PHP
を再コンパイル('make clean; make' としてください)すれば問題は
解決されます。
-
Unix/Windows: PHP をインストールしたのですがブラウザから PHP
スクリプトにアクセスしても何も表示されません。
-
ブラウザの「ソースの表示」を実行してください。おそらく PHP の
ソースコードが表示されると思います。これはウェブサーバーがスクリプトを
PHP に渡していないためスクリプトが実行されていない、ということを
意味します。サーバー側の設定のどこかが間違っているはずですので、
PHP インストールマニュアルに従って再度入念に設定を確認してみてください。
-
Unix/Windows: PHP をインストールしたのですがブラウザから PHP
スクリプトにアクセスすると Internal Server Error 500 となってしまいます。
-
ウェブサーバーが PHP を実行するときに何らかの問題が起きています。
どんなエラーが起こっているか確認するために、コマンドラインで PHP
実行ファイル(Windows では php.exe) のある
ディレクトリに移動して php -i
を実行してください。
もし PHP の実行時に問題があった場合は適切なエラーメッセージが表示されるので、
それを手がかりに次に何をすべきかを知ることができます。画面
一杯に HTML(phpinfo 関数の出力)が表示された場合には
PHP は問題なく動作していますので、問題はウェブサーバーの設定
にあるはずです。再度入念にチェックしてみてください。
-
PHP をインストールするまではエラーもなく問題なく進んだのですが、
Apache を起動させようとすると undefined symbol エラーが発生します。
[mybox:user /src/php5] root# apachectl configtest
apachectl: /usr/local/apache/bin/httpd Undefined symbols:
_compress
_uncompress
-
これは、PHP とは関係なく MySQL クライアントライブラリの問題です。
このライブラリのうちある種のものは --with-zlib を指定する必要がありますが、
他のものは必要ありません。この問題は MySQL FAQ でも扱われています。
-
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.exe、php5ts.dll、
php.ini もしくはロードしようとしている PHP 拡張モジュールの
ファイルパーミッションが匿名インターネットユーザー
IUSER_<machinename>
にアクセスできない
ものになっている。
-
スクリプトが存在しない(もしくはあなたが在ると思っている場所と
ウェブサーバーのルートディレクトリからの相対位置がずれている)。
IIS を使用している場合は、Internet Service Manager でスクリプト
マッピングを設定するときに「ファイルの存在を確認する」にチェックを
することでこのエラーをトラップすることができます。もしスクリプト
ファイルが存在しない場合はサーバーが代わりに 404 エラーを返すように
なります。これにはもう一つ利点があります。それは IIS が
スクリプトファイルの NTLanMan パーミッションに応じて認証を要求する
ようになる、ということです。
-
Windows: 全ての説明に従っているのに PHP が IIS で動作しません!
-
PHP スクリプトを実行しようとするあらゆるユーザーが
php.exe の実行権限を必要としているということを
忘れないでください。IIS はインストール時に追加された匿名ユーザーを使用
します。このユーザーに対して php.exe の実行権限が
必要です。また、認証された全てのユーザーに関しても
php.exe の実行権限が必要です。IIS4 の場合はさらに
PHP がスクリプトエンジンであるということを教えてやる必要があります。
この FAQ
も読んでください。
-
IIS, PWS, OmniHTTPD, Xitami上でCGIとしてPHPを実行するとき、
次のようなエラーが出る:
Security Alert! PHP CGI
cannot be accessed directly.
-
cgi.force_redirect
に 0
をセットしてください。デフォルトでは
1
にセットされていますので、そのディレクティブが
;
でコメントアウトされていないことを確認してください。
他のディレクティブと同様にこれは php.ini 上でセットされます。
デフォルトは 1
なので、100% 正しく php.ini ファイルが
読み込まれているかどうかが重要です。
詳細はこの FAQ を
読んでください。
-
php.ini が認識され読み込まれていることをどうやって知ることが
できますか? 自分の行った変更が反映されてないらしいのですが。
-
php.ini とそれが PHP に読み込まれているかを確認するには
phpinfo をコールして最初のほうに
表示されている Configuration File (php.ini)
を見てください。これは PHP が認識している php.ini と、それが
読み込まれているか否かを示しています。ディレクトリパスだけが
表示されている場合は、読み込まれていないということなので、
そのディレクトリに php.ini を置いてください。
php.ini が PATH にある場合それが読み込まれます。
php.ini が読み込まれていてかつ PHP をモジュールとして実行
している場合、php.ini を変更した後で必ず Web サーバーを
再起動してください。
php_ini_loaded_file も参照ください。
-
Windows 上の PHP で、php.ini を使えるようにするにはどうしたらいいのですか?
-
いくつかの方法があります。Apache を使用しているのなら、
Apache のドキュメントを参照ください。
それ以外の場合は、環境変数 PHPRC を指定する
必要があります。
-
Apache のコンテントネゴシエーション(MultiViews オプション)を
PHP で使用することはできますか?
-
もしリンクする PHP ファイルが拡張子を持っているなら、すべては
うまく動作します。この FAQ が対象としているのは、リンクする
PHP ファイルが拡張子を持っておらず、拡張子のない URL から PHP
ファイルを判別するためにコンテントネゴシエーションを使用する方法です。
この場合、AddType application/x-httpd-php
.php
という行を以下のように変更します。
AddHandler php5-script php
AddType text/html php
この方法は、Apache 1 ではうまく動作しません。なぜなら PHP モジュールが
php-script
をキャッチできないからです。
-
PHP が処理できるリクエストメソッドは GET および POST だけなのですか?
-
いいえ、それ以外のいかなるメソッド(例: CONNECT)でも扱えます。
適切な応答ステータスは、header を使用して送信可能です。
GET および POST だけを処理したいなら、Apache の設定を以下のようにします。
<LimitExcept GET POST>
Deny from all
</LimitExcept>