PHP
Apache

同一Apache内で異なるバージョンのPHPを共存させる

微妙な悩み

私の仕事用Macのローカル環境は、PHP7.1で環境構築してます。
しかし、ちょっと古めの案件の運用をするとなると、
PHP5.6じゃないと動作しないことがあったりします。

VagrantやDockerでPHP5.6の環境を構築すれば良いか。。。
と思い、しばらく仮想環境で作業していましたが、
都度、環境を切り替える手間が発生したり、
仮想環境内にログインして作業するのが面倒になることが多々有りました。

まして、この案件以外は、Macのローカル環境(PHP7.1)で動作するので、
この案件だけ仮想環境を使わないといけないというのが、なんとももどかしい。

どうにかして全部Macのローカル環境で動かせないものかと調べ始めました。

皆さんはこういう時、どうしてるんですかね?

実現したいこと

Macのローカル環境は、PHP7.1で動作させる。
特定のディレクトリ配下だけ、PHP5.6で動かしたい。

色々ググった

モジュール版PHPとCGI版PHPを併用すれば、実現出来そう!

同一apache内でモジュール版phpとcgi版phpを共存させる

現状は、Apache2.4 + モジュール版PHP7.1で動作させてるので、
CGI版PHP5.6を導入したいと思います。

今回は、参考記事通りにPHPをソースからビルドしていきます。
一応、homebrewのphp56のオプションに--with-cgiが有ったので試そうかと思いましたが、
現状のPHP71環境に影響が出そうな気がしたので見なかったことにしました。

$ brew options php56
--with-cgi
    Enable building of the CGI executable (implies --without-fpm)

PHP5.6導入手順

ソースの取得

$ wget http://jp2.php.net/get/php-5.6.32.tar.gz/from/this/mirror -O php-5.6.32.tar.gz

取得したら解凍して、適当なディレクトリに配置します。
今回は、下記のディレクトリに配置しました。

$ pwd
/usr/local/src/php-5.6.32

各種ディレクトリの作成

PHP5.6のインストール先とphp.iniの格納先を作成しておきます。

$ mkdir -p /usr/local/src/php-5.6.32/maked/ini

PHPビルドに必要なものを導入

私の場合は、これだけで大丈夫でした。
適宜、必要なものを導入してください。

$ brew install openssl libxml2 libiconv

オプションの設定

# -----------------------------------------------------------
# --prefix                : インストール先
# --enable-mbstring       : 無くても良し
# --with-config-file-path : php.iniの読み込み先
# --with-pdo-mysql        : 無くても良し
# --with-mysql            : 無くても良し
# -----------------------------------------------------------
$ ./configure \
--prefix=/usr/local/src/php-5.6.32/maked \
--enable-mbstring \
--with-config-file-path=/usr/local/src/php-5.6.32/maked/ini/ \
--with-openssl=$(brew --prefix openssl) \
--with-libxml-dir=$(brew --prefix libxml2) \
--with-iconv=$(brew --prefix libiconv) \
--with-pdo-mysql \
--with-mysql

ビルド + インストール

パスが通ってない、あれが無い、これが無い等で色々エラーが出ると思います。
丹念にエラーを潰していきます。

あと、make & make testで15分ぐらいかかるので地味に苦痛です。

$ make
$ make test
$ make install

php.iniの作成

適宜作成してください。

$ vi maked/ini/php.ini

PHPのバージョンを確認

$ ./maked/bin/php -v
PHP 5.6.32 (cli) (built: Nov 10 2017 22:38:57) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

ApacheにCGI版PHPを読み込ませる

httpd.conf内にApacheがCGIの実行ファイルを読み込んでいるディレクトリが有ります。

$ less /usr/local/etc/httpd/httpd.conf
ScriptAlias /cgi-bin/ "/usr/local/var/www/cgi-bin/"

cgi-binディレクトリ直下にPHP5.6のインストール先のシンボリックリンクを作成します。

$ ln -s /usr/local/src/php-5.6.32/maked/bin/php-cgi /usr/local/var/www/cgi-bin/php-cgi

Apacheがcgi-bin配下のシンボリックリンクを辿るように設定します。

$ vi /usr/local/etc/httpd/httpd.conf
<Directory "/usr/local/var/www/cgi-bin">
    AllowOverride None
+    Options +FollowSymLinks
    Require all granted
</Directory>

Apacheのバーチャルホスト設定

特定のディレクトリだけCGI版PHP5.6で動くように設定します。

$ vi /usr/local/etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/usr/local/var/www/html/[あの案件]"
    ServerName localhost
+    Action php56 /cgi-bin/php-cgi
+    AddHandler php56 .php
    <Directory "/usr/local/var/www/html/[あの案件]">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

これであの案件だけPHP5.6で動作させることが出来ました。
これで中途半端に仮想環境を使わなくて済みます。