目次

83 PHP複数バージョンを共存

1.環境

CentOS 6
PHP 5.3

下記でインストールされている環境を想定
15 CentOS6 suPHP7.2

2.phpインストール

レポジトリ用意

# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

yumインストール

php56と、php71を入れてみる
他にも入れる場合は、同じ要領でインストール

# yum install php56 php56-php-{gd,xml,mbstring,mysqlnd}
# yum install php56-php-{opcache,pecl-apcu,pecl-memcached,pecl-zip}

# yum install php71 php71-php-{gd,xml,mbstring,mysqlnd}
# yum install php71-php-{opcache,pecl-apcu,pecl-memcached,pecl-zip}

opcache,apcuについて

3./etc/suphp.conf

handlersをphp56,php71分の用意

/etc/suphp.conf

[handlers]
;Handler for php-scripts
x-httpd-php="php:/usr/bin/php-cgi"
x-httpd-php56="php:/usr/bin/php56-cgi"
x-httpd-php71="php:/usr/bin/php71-cgi"

4.Apache側のsuphp.conf

AddHandler をphp56,php71分と
suPHP_AddHandler をphp56,php71分用意

/etc/httpd/conf.d/suphp.conf

LoadModule suphp_module modules/mod_suphp.so
suPHP_Engine on
AddHandler x-httpd-php .php
AddHandler x-httpd-php56 .php
AddHandler x-httpd-php71 .php

suPHP_ConfigPath /etc
suPHP_AddHandler x-httpd-php
suPHP_AddHandler x-httpd-php56
suPHP_AddHandler x-httpd-php71

5.後はユーザディレクトリ

上記までで設定は完了
後は、phpを使いたいディレクトリに.htaccessを置いてあげるだけです。

※注意
.htaccessで設定する場合に、ちゃんとFilesMatchでphpファイルを指定しないと、
全てのファイルに対して、suphpでアクセスする事になってしまう。
その場合、suphp側ではmimeを判断しないので、php.iniの下記を参照し
全てのcontents-typeがtext/htmlになってしまう。

php.ini

default_mimetype = "text/html"

php7.1が利用したい場合

.htaccess

<FilesMatch "\.php$">
    SetHandler x-httpd-php71
</FilesMatch>

php5.6が利用したい場合

.htaccess

<FilesMatch "\.php$">
    SetHandler x-httpd-php56
</FilesMatch>

何も指定しない場合

.htaccessに何も設定されてない場合は、デフォルトのハンドラー(この環境ではphp5.3)が利用されます。

.htaccess


何も設定しない場合は、下記suphp.confで一番に下に設定されているAddHandler でアクセスする事になります。
下記の場合php53

/etc/httpd/conf.d/suphp.conf

# To use suPHP to parse PHP-Files
AddHandler x-httpd-php71 .php
AddHandler x-httpd-php56 .php
AddHandler x-httpd-php .php

6. php.ini

/etc/httpd/conf.d/suphp.confで、suPHP_ConfigPathを指定してしまうと、どのバージョンのphpでも
同じphp.iniを読みに行ってしまう。

suPHP_ConfigPathをコメントアウトしておくと下記のようになります。

# for v in '' 56 71 ; do php$v --ini | grep Loaded | awk '{print $4}' ; done
/etc/php.ini
/opt/remi/php56/root/etc/php.ini
/etc/opt/remi/php71/php.ini

ユーザディレクトリphp.ini

ユーザディレクトリでphp.iniを利用したい場合は、利用したいディレクトリにphp.iniを起きます。
このままだと、php.iniを置いたディレクトリしか反映してくれません。
その為、.htaccesに記述する事で、配下のディスクへも反映させます。

suPHP_ConfigPath    /home/hoge/public_html/
<Files ~ "\.ini">
deny from all
</Files>

.htaccess用の設定

その時、ApacheのDirectoryに「Options」を入れておかないと、 下記のエラーとなります。

<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit Options

エラー

/home/hoge/public_html/.htaccess: suPHP_ConfigPath not allowed her

php.ini設定のマージ

ユーザディレクトリにphp.iniを置いた場合は、iniファイルが読まれる順番が、php.ini → php.dなので
デフォルトのphp.iniから変更されてる項目はマージしてくれません。

デフォルトから変更の必要なありそうな項目は、php.d内のファイルに記述してあげた方が良い。

session.save_handler = memcached
date.timezone = 'Asia/Tokyo'

7.コマンドラインPHP切り替え

$ module load php71
$ php -v
PHP 7.1.17 (cli) (built: Apr 25 2018 07:35:01) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.17, Copyright (c) 1999-2018, by Zend Technologies