ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【PHP】IIS上でPHPを動かす際にハマったこと

time 2017/10/27

sync 更新履歴
2017/11/14
一部項目を修正しました

というわけで、今回はPHPとIISに関するお話です。

自分の場合、PHPはApache上で動かすことが圧倒的に多い…というかそれ以外で動かしたことがありませんでした。
そんな中、仕事の関係でちょっとしたサンプルプログラムをIIS上で動かすことになりましたが、その際にあれこれハマってしまったので、備忘録を兼ねて書いておきます。

環境

・Windows Server 2016
・IIS 10
・PHP 7.0.20 (NTS)

ハマったこと

php.iniが読み込まれない

PHPのトラブルの中では最早様式美というくらい報告されている話です。
Windowsの場合は「Configuration File (php.ini) Path」がC:\Windowsになっているので真に受けてしまいましたが、実際は「環境変数(Path)で指定したPHPディレクトリ直下」に配置すれば読み込まれるようです。

また、「php.ini自体の構文エラー」にも注意しましょう。コマンドプロンプトからphp -c (php.iniのパス)で構文チェックができます。

php.iniを変更しても設定が反映されない

IISマネージャでいうところの「サイト」ではなく「アプリケーションプール」を選択し、「リサイクル」を実行します。
ついサイト自体を再起動してしまいがちですが、それでは反映されないようです。

「コンピューターにVCRUNTIME140.dll がないため、プログラムを開始できません。」と言われる

「Visual C++」のランタイムをインストールしましょう。PHPのバージョンによって変わりますが、7.0の場合は2015が必要でした。
https://www.microsoft.com/ja-jp/download/details.aspx?id=48145

インストール自体はすぐ終わるはずです。

今回の件とは別ですが、「MySQL 5.7」をインストーラから入れようとした際もC++ランタイムで引っ掛かったことがあります。その時は64ビット版だけを入れても上手くいかず、32ビット版もインストールする必要がありました。
詳しい話はstackoverflowに載っています。
https://stackoverflow.com/questions/45163588/mysql-5-7-installer-fails-to-detect-vs-2013-redistributable

アクセス時に「502 Bad Gateway」が返ってくる

php.iniのcgi.force_redirectを0に変更します。
どんな設定か分からず変えるのは技術者としてよろしくないので調べてみると、公式マニュアルにそれっぽい説明がありました。
http://php.net/manual/ja/security.cgi-bin.force-redirect.php

「force_redirect」なだけあって、リダイレクト時にしかPHPが実行できなくなる…という感じでしょうか。
MVCなフレームワークを使っていれば問題なさそうですが、今回は生PHPのざっくりしたサンプルなので無効化してしまいます。セキュリティ的によろしくないようですが、イントラ内のテスト環境なので問題ありません。

【2017/11/14 追記】
PHP公式マニュアルに書かれているのを見逃していました。IISは0に設定すべきだそうです。
http://php.net/manual/ja/ini.core.php#ini.cgi.force-redirect

header() が上手く動作しない

原因は以下の2つでした。

・ファイルの文字コードが「UTF-8のBOM付き」になっていた
Locationの指定が相対パスだった

BOM付きについては「サクラエディタ」とか入っていればサーバ上から直せるのですが、そんないいものは入っていなかったので再コピーする羽目に。

後者はApacheなら動作しますが、IISではスキーム名 (http) まで含めたURLでないと動きませんでした。絶対URLで書くのが正しいそうなので、今後は注意します。
特に最近はフレームワークに任せきりだったのでなおさらです。

BASIC認証のユーザー名・パスワードの指定

Apacheでは.htpasswdで指定するのが一般的かと思いますが、IISではWindowsユーザーのユーザー名・パスワードを使用するそうです。
OS側でユーザーを追加しなければならないのは面倒に感じます。

あとがき

そんなわけで、IIS上でPHPを動かした際に詰まった点を書き連ねてみました。
Apacheとは勝手が違う部分が多くてビックリです。

これで大手Webサーバの中では「Nginx」だけ触ったことがないことになります。最近まで読み方も知らなかったりしましたが、Apacheよりいいウワサも耳にするので、ちょっと気になるところです。

down

コメントする