しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Visual Studio Code と IIS Express を使って PHP 7 の実行環境を整える

これまで Umbraco で管理してた shibayan.jp を、もっと軽量で書きやすい Flat-file CMS である Grav に移行するために、Visual Studio Code と IIS Express で快適にローカルで確認できる環境を作ろうと思いました。

少し前まではこういう場合 WebMatrix を使っていましたが、公式サイトを久しぶりに見ると Visual Studio Code を全力でお勧めしていました。

f:id:shiba-yan:20160722013520p:plain

手軽だったので少し寂しいですが、Visual Studio Code の方が機能豊富で使いやすいので仕方ないですね。

しかし Visual Studio Code でも IIS Express を使ってコード書けるようにしたいわけです。Grav については今回紹介しないですが、気が向けばインストール方法とか書くかもしれません。まずは環境を作ります。

PHP 7 をインストール

Web PI を使うと IIS Express 向けの各 PHP ランタイムをインストール出来るので、必要なランタイムを選んでインストールします。今回は PHP 7 の x86 版を選びました。

f:id:shiba-yan:20160721234348p:plain

同時に WinCache が入りますが、自動で設定されるので特に気にする必要はないです。PHP 7 のインストールはたったこれだけで完了です。Web PI は便利ですね。

IIS Express 拡張をインストール

f:id:shiba-yan:20160721234549p:plain

IIS Express - Visual Studio Marketplace

IIS Express 拡張をインストールすると、コマンドパレットから IIS Express の起動と終了が実行出来るようになります。IIS と入力すると候補が出てくるので簡単ですね。

f:id:shiba-yan:20160721234655p:plain

まず Run Website を選ぶと、さらにメニューが続く形になっているので最初は戸惑いました。

f:id:shiba-yan:20160721234730p:plain

これで IIS Express の Start と Stop が出来るようになりましたが、このままだと PHP アプリケーションが動かないので、FastCGI とハンドラーの設定を追加します。

applicationHost.config を修正

WebMatrix を使っていた場合にはドキュメント以下に IIS Express ディレクトリが作られて、そこに applicationHost.config が存在していますが この拡張は Application Server Mode で IIS Express を起動するので、設定場所が少し異なっています。

Application Server Mode については以下のブログにしか書いてない気がします。貴重な記事です。

Working with the Different IIS Express Modes and HTTPS | Microsoft Docs

とりあえず PHP 7 を動かすためには FastCGI の設定と php 拡張子に対するハンドラーの追加だけです。このあたりは PHP 公式サイトに情報が載っているので参考にして進めます。

PHP: Windows 上での PHP の手動インストール - Manual

PHP 7 for IIS Express は Program Files の IIS Express 以下にランタイムがインストールされるので、PHP のパスは読み替える必要があります。

Application Server Mode では IIS Express 以下の AppServer\applicationhost.config が使われるので、appcmd のパラメータでこの config を編集対象にします。管理者権限が必要なので少し注意です。

REM Clear current PHP handlers
appcmd clear config /section:system.webServer/fastCGI /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"
appcmd set config /section:system.webServer/handlers /-[name='PHP_via_FastCGI'] /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"

REM Set up the PHP handler
appcmd set config /section:system.webServer/fastCGI /+[fullPath='"C:\Program Files (x86)\IIS Express\PHP\v7.0\php-cgi.exe"'] /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"
appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='"C:\Program Files (x86)\IIS Express\PHP\v7.0\php-cgi.exe"',resourceType='Unspecified'] /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"
appcmd set config /section:system.webServer/handlers /accessPolicy:Read,Script /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"

REM Configure FastCGI Variables
appcmd set config -section:system.webServer/fastCgi /+[fullPath='"C:\Program Files (x86)\IIS Express\PHP\v7.0\php-cgi.exe"'].instanceMaxRequests:10000 /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"
appcmd set config -section:system.webServer/fastCgi /+[fullPath='"C:\Program Files (x86)\IIS Express\PHP\v7.0\php-cgi.exe"'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000'] /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"
appcmd set config -section:system.webServer/fastCgi /+[fullPath='"C:\Program Files (x86)\IIS Express\PHP\v7.0\php-cgi.exe"'].environmentVariables.[name='PHPRC',value='"C:\Program Files (x86)\IIS Express\PHP\v7.0\php.ini"'] /apphostconfig:"C:\Program Files (x86)\IIS Express\AppServer\applicationhost.config"

実行すると PHP 7 の実行に必要な設定が書き込まれます。

今後のアップデートでカスタムの applicationHost.config を指定できるようになるかもしれないですが、今はこれしか方法が無いと思います。アップデートに期待したいところです。

IIS Express でサイトを起動

全ての設定が完了した後に、コマンドパレットから Start Website を実行すると IIS Express が起動されて、自動的にブラウザが立ち上がります。

f:id:shiba-yan:20160721234924p:plain

ちゃんと PHP で書かれている Grav も実行できました。shibayan.jp は GitHub でファイルを管理して、Web App と連携してあるので git push すると数秒後に反映されるようになってます。

なので、自分のマシン上でどのように見えるのか、事前に確認しながら書ける環境が必要なのでした。