WindowsのApacheにPHPを連携
前回、ApacheサーバーをWindows10にインストールしてSSL化しました。今回はそのApacheサーバーにPHPを連携させてみたいと思います。PHPにはモジュールで使うTS版と主にCGIで使うNTS版があるので、両方ともセットアップしてみました。
PHPとスレッドセーフ
PHPはよくApacheサーバーとセットになって紹介されていますが、単独でも動かすことのできるプログラミング言語です。
Windows用のプログラムはwindows.php.netよりダウンロードすることができます。
Apacheもそうでしたが、VCのランタイムが必要です。自身の環境に存在していないようなら、Microsoft「サポートされている最新の Visual C++ 再頒布可能パッケージのダウンロード」からダウンロードしてインストールしてください。
種類は、PHPのバージョンと、マシンのアーキテクチャの他に、「Non Thread Safe(NTS)」版と「Thread Safe(TS)」版があります。
この違いを理解するためにはプロセスとThread(スレッド)について理解する必要があります。アプリケーションが実行される際プロセスが作成されます。プロセスではスレッドという単位で処理が行われます。スレッドを複数持つことにより同時に複数の処理が可能になります。TS(スレッドセーフ)とはこのような複数スレッドの場合でも正しい稼働が保証されているバージョンです。
Windows用のプログラムにはそれらの区別がありませんがApacheサーバーにも、woker MPMなどの複数のスレッドを動かすためのバージョン(モード)と、prefork MPMといった単一のスレッドしか持たないバージョンがあります。そのような環境に合わせてPHPのバージョンも決定することになりますが、基本はマルチスレッドで処理するならTS版、そうでないならNTS版ということになります。
モジュール版だとPHPはApacheと同じユーザーになるのに対し、CGI版は別のユーザーで動かすことができます。セキュリティの観点からは後者の方がいいのですが、処理毎にプロセスを作成する分オーバーヘッドが大きくなります。ただし最近はそれを軽減するFastCGIという技術により改善されています。
モジュール&TS版
WindowsへのApache&PHPのインストールは通常はこちらのバージョン使うことが多いと思います。
windows.php.netから、TS版のZIPファイルをダウンロードして展開します。展開して作成されたフォルダを好きな場所に置きます。執筆時点での最新は8.1.1でした。
Windows用の記述方法は公式のPHPマニュアルにありますが、どのような設定をしているか解説しながら紹介ていきます。
まずモジュール版なのでPHPをApacheに読み込みます。C:¥Apache24¥conf¥httpd.confに次の記述を加えます。
httpd.conf
...
# PHP7系の場合
LoadModule php7_module "C:/php/php7apache2_4.dll"
#PHP8系の場合
LoadModule php_module "C:/php/php8apache2_4.dll"
...
ライブラリの場所は環境に合わせて変えて下さい。また、PHP8の場合モジュール名にバージョンが含まれません。
FilesMatchで.phpで終わるファイルに限定して、それを「application/x-httpd-php」(PHP)として処理をする設定を記述します。
httpd.conf
...
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
...
PHPファイルをApacheに認識させる方法は上記の記述のほか、AddTypeや、AddHandlerでも同様の設定が可能ですが、セキュリティの観点からあまり推奨されていません。
読み込んだPHPを動かすための設定ファイルのあるフォルダをPHPIniDirで設定します。フォルダの中にphp.iniファイルがある前提です。展開したPHPフォルダの中に「php.ini-production(本番用)」「php.ini-development(開発用)」のという設定ファイルのひな型があるのでコピーしてphp.iniにリネームしておきます。
httpd.conf
...
PHPIniDir "C:/php"
...
これで稼働の為の設定は終了です。apacheのドキュメントフォルダ(htdocs)にsample.phpをおいて表示させてみます。
sample.php
<?phpphpinfo();
Apacheからモジュール版で使う場合はPHPにパスを通す必要ありませんが、PHP環境を導入したことがある場合、古いバージョンのパスがあると競合してうまく動かないことがありますので注意してください。
FastCGI&NTS版
純粋なCGI版も稼働させることができますが、オーバーヘッドのことを考えるとあまりメリットはありませんので、ここでは導入の可能性のあるFastCGI版を使います。
PHPのNTS版をダウンロードして展開し、好きな場所に配置します。ここではc:¥php-8-ntsにしました。
ApacheのFastCGIモジュールは標準では含まれていないので、Apache Loungeからダウンロードします。
ここでははmod_fcgid-2.3.10-win64-VS16.zipをダウンロードしました。展開た後に出力されるフォルダの中に「mod_fcgid.so」という名前のファイルがあるのでApacheのmodulesフォルダの中に入れます。
Apacheのhttpd.confファイルに、次の設定を記述します。モジュール版の記述がある場合は削除するかコメントアウトしてください。
まず、FastCGIモジュールを読み込みます。ファイルがApacheのmodulesフォルダにいるので相対パスで記述しています。
httpd.conf
...
LoadModule fcgid_module modules/mod_fcgid.so
...
次にPHPの設定ファイルがあるディレクトリの記述ですが、これはFastCGIの環境変数「PHPRC」にセットします。
httpd.conf
...
FcgidInitialEnv PHPRC "C:/php-8-nts"
...
.phpファイルをFastCGIスクリプトとして処理する設定になります。
httpd.conf
...
<FilesMatch \.php$>
SetHandler fcgid-script
</FilesMatch>
...
最後にFastCGIとPHPの実行環境を仲介してくれるラッパーの設定です。これも.phpファイルに対して設定します。
httpd.conf
...
FcgidWrapper "C:/php-8-nts/php-cgi.exe" .php
...
デフォルトだとApacheのCGI実行ファイルは、cgi-binフォルダに入れることになっているので、sample.phpをそこへ移動して、http://localhost/cgi-bin/sample.phpとして表示させます。
Server APIの項目にFastCGIで稼働していることを示す「CGI/FastCGI」という記述があります。
ちなみに、モジュール版をNTSで動かそうと思ってもphp8apache2_4.dllがないので不可能ですが、FastCGI版の方はNTS、TSのどちらでも動かすことができます。
mbstringの設定
最後にCGI版とモジュール版どちらでも使うであろう日本語対応の方法について紹介します。
PHPはデフォルト設定だと日本語をはじめとするマルチバイト文字が有効になっていません。そこで拡張ライブラリであるmbstringを使う設定をします。
まず、拡張ライブラリのある場所を示すextension_dirの設定をして、そのあとでextension=mbstringのコメントアウトを外して有効にします。
UTF-8以外の環境で使う場合はdefault_charsetの値も変更します。
php.ini
...
# UTF-8以外の環境の場合は変更します。
default_charset = "UTF-8"
# On windows:と記述のある
# こコメントアウトをはずす
# これで動かない時は絶対パス(c:/php/ext)を試してみて下さい。
extension_dir = "ext"
# コメントアウトを外す
extension=mbstring
...
php.iniファイルの後半にあるmbstring個別の設定も変更します。mbstringの言語のデフォルト値をJapaneseにして、文字コートの検出順序を設定します。detect_orderはautoにすると「ASCII,JIS,UTF-8,EUC-JP,SJIS」の順にチェックします。環境によって優先順を変えたい場合は,区切りで順序を指定します。
php.ini
...
[mbstring]
# コメントアウトを外す
mbstring.language = Japanese
# コメントアウトを外す
mbstring.detect_order = auto
...
次の項目は、従来は設定しましたが現在では非推奨となっていますので、コメントアウトのままにしておきます。またバージョン8からはmbstring.func_overloadの機能は削除されました。
- mbstring.internal_encoding
設定したい場合は「internal_encoding」に設定します。設定しない場合は、default_charsetの値になります。
- mbstring.http_input
設定したい場合は「input_encoding」に設定します。設定しない場合は、default_charsetの値になります。
- mbstring.http_output
設定したい場合は「output_encoding」に設定します。設定しない場合は、default_charsetの値になります。
PHPを設定したら今度はデータベースを設定したくなると思いますが、サーバーを持たずにデータベース機能実装できるSQLite3をPHPに設定する方法を別記事にまとめていますのでよろしかったら合わせて読んでください。