--> -->
Windowsの開発環境でPHP5と7を共存させる方法です。
WindowsのApache+PHPの組み合わせには、VCランタイムの問題が絡むので、PHP7はfirst-cgiで動作させて切り離してみました。
> php-cgi.exe -b 127.0.0.1:8073
LoadModule mime_module modules/mod_mime.so LoadModule proxy_module modules/mod_proxy.soローカル環境ではVirtualHostではなくaliasを使う場合が多いと思います。以下のように設定します。
Alias /hoge "C:\Users\fuga\Documents\html\hoge" <Directory "C:\Users\fuga\Documents\html\hoge"> ProxyFCGIBackendType GENERIC <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:8073#" </FilesMatch> AllowOverride all Require all granted </Directory>CentOS版と異なるのは、3行目のProxyFCGIBackendType GENERICと、5行目の行末に#が入っているあたりです。
ProxyTimeout 600
DOS窓が邪魔な場合は、RunHiddenConsoleというのがあるようです。
php-cgi.exeをただ起動しただけではプロセスが1つしか起動せず、処理可能な同時コネクション数も1つになります。
このままでは、SPAなどのブラウザから同時に複数のアクセスが走るような処理ではパフォーマンスが大幅に悪くなってしまいます。
そこで、以下のように設定を入れてあげます。
@ECHO OFF set PHP_FCGI_CHILDREN=8 set PHP_FCGI_MAX_REQUESTS=10000 RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:8073
このとき、設定変数の意味はそれぞれ以下の通りです。
環境変数 | 意味 |
PHP_FCGI_CHILDREN | 起動する子プロセス数を指定します。上記の様に8を指定すると、8個のプロセスが起動します。 |
PHP_FCGI_MAX_REQUESTS | 子プロセスが起動中に処理できるリクエスト数を指定します。指定回数処理すると自動終了します。(参考URL(iii)参照。記事中では(当時は)Windowsでは使用不可と書かれていますが、今は使えるようです) |
これらを実現するため、PHP5.6は今まで通りモジュールで動かし、PHP7はfcgiで動かします。
sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm sudo yum install yum-utils sudo yum-config-manager --enable remi sudo yum install php73-php-{opcache,pecl-apcu,pecl-memcached,cli,gd,mbstring,mcrypt,mysqlnd,pdo,xml} sudo yum install php73-php-fpmremiリポジトリでインストールすると、既存のPHP5環境には影響を与えず、別のディレクトリ群にPHP7をインストールすることができます。
sudo vi /etc/opt/remi/php73/php-fpm.d/www.conf以下の部分を変更します。(UNIX socketで接続するケース)
listen = /var/run/php-fpm/php-fpm.sock listen.owner = apache listen.group = apache listen.mode = 0660pidファイルを作成するためのディレクトリを作ります。
sudo mkdir /var/run/php-fpm
sudo vi /etc/httpd/conf.d/vhost.confphp-fpmとの連携を追記します。
<VirtualHost *:443> ServerName vhost.example.jp DocumentRoot /var/www/hoge <FilesMatch \.php$> SetHandler proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost </FilesMatch> : </VirtualHost>通常のVirtualHost設定に、<FilesMatch>〜</FilesMatch>部分を追加するだけです。
ProxyTimeout 300
sudo systemctl start php73-php-fpm sudo systemctl enable php73-php-fpm sudo systemctl reload httpd
上記の例で言うと、/var/www/hoge/index.phpなどを作って、https://vhost.example.jp/にアクセスし、表示されれば成功です。
この方法であれば、恐らく(試してないけど)何個でも異なるバージョンのPHPを共存させることが可能だと思います。(その場合sockファイル名は分ける)