yumでCentOS6.7にPHP7をインストールする方法とハマった点

PHP

※当ブログではアフィリエイト広告を利用しています。

長らくPHP5.5で動かしていた当サイトでしたが、ローカルで試してWordPressが問題なく動きそうなのでPHP7にバージョンを上げてみました。

ご多分に漏れず今回もハマったポイントがあったのでインストール完了までをメモします。

インストール方法とハマった点

nginx + PHP + php-fpm + MySQLで動作している当サイトにPHP7をインストールした方法です。

今回はPHP5.5を削除してPHP7を新規インストールしました。php-fpmが一旦消えるため再度設定が必要な点までは想定していましたが途中のハマリポイントも含めて記載します。

PHP7インストール前

$ php -v
PHP 5.5.15 (cli) (built: Jul 24 2014 10:25:49)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

Remiリポジトリ追加

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

ちなみにCentOS7の場合はそれぞれremi-release-7.rpmとなります。

旧バージョン(PHP5.5)削除

# yum remove php-*

新バージョン(PHP7)インストール

# yum install —enablerepo=remi-php70 php php-fpm php-mcrypt php-cli php-common php-devel php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-pear php-pecl-apcu php-pecl-zip php-process php-xml

ここで第一のハマリポイントです。当サイト環境特有の事象だとは思いますが以下のエラーが出て一部パッケージがインストールできませんでした。

エラー: パッケージ: php-pecl-zip-1.13.2-1.el6.remi.7.0.x86_64 (remi-php70)
             要求: php(zend-abi) = 20151012-64
            利用可能: php-common-5.3.3-40.el6_6.x86_64 (base)
・・・中略・・・
エラー: パッケージ: php-opcache-7.0.6-3.el6.remi.x86_64 (remi-php70)
             要求: php-common(x86-64) = 7.0.6-3.el6.remi
            利用可能: php-common-5.3.3-40.el6_6.x86_64 (base)
・・・中略・・・
エラー: パッケージ: php-pecl-zip-1.13.2-1.el6.remi.7.0.x86_64 (remi-php70)
             要求: php(api) = 20151012-64
            利用可能: php-common-5.3.3-40.el6_6.x86_64 (base)
・・・中略・・・
 問題を回避するために —skip-broken を用いることができません

どうも以前リポジトリの優先度を変えており、いくつかのパッケージが優先度プロテクションによって除外されているのが原因のようですがどこを変えたのか忘れてしまったため、PHP7用のRemiリポジトリの優先度を1(最大)にすることで問題を回避しました。

# vi /etc/yum.repos.d/remi-php70.repo

[remi-php70]の直下にpriority=1を追記します。

[remi-php70]
priority=1
name=Remi’s PHP 7.0 RPM repository for Enterprise Linux 6 - $basearch
#baseurl=<a href="http://rpms.remirepo.net/enterprise/6/php70/$basearch/">http://rpms.remirepo.net/enterprise/6/php70/$basearch/</a>
mirrorlist=<a href="http://rpms.remirepo.net/enterprise/6/php70/mirror">http://rpms.remirepo.net/enterprise/6/php70/mirror</a>
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

上記を実施した後に再度yum installすると全てのパッケージをインストールできました。

php-fpmの設定

旧バージョンのPHP関連パッケージを削除した際にphp-fpmの設定も消えているため、nginx用の設定変更点を再度反映します。

# vi /etc/php-fpm.d/www.conf

以下、セミコロンなしが変更後、セミコロンではじまるものが変更前です。

listen = /var/run/php-fpm.sock
;listen = 127.0.0.1:9000
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
;user = apache
; RPM: Keep a group allowed to write in log dir.
group = nginx
;group = apache
pm = static
;pm = dynamic

上記変更後、念のためphp-fpmを再起動します。

# /etc/init.d/php-fpm restart

PHP7で下位互換性のない変更点の修正

これでPHP7でWordPressが動くはず・・・と思いきやサイトを開くと500 Internal Server Error状態になってしまいました。

nginxのエラーログを見てみると、どうも独自のWordPressテーマでPHPの構文エラーが発生しているようです・・・。

# vi /var/log/nginx/error.log
2016/05/04 00:09:44 [error] 20516#20516: *22 FastCGI sent in stderr: “PHP message: PHP Parse error:  syntax error, unexpected ‘new’ (T_NEW) in [テーマファイル]

テーマファイルの該当箇所を調べてみるとnewしたWP_Queryオブジェクトを参照渡しで変数に代入する記述になっていました。しかしPHP7ではこれが構文エラーとなるよう変更されたようです。

new 文の結果を参照渡しで変数に代入することができなくなりました。

ちなみに該当箇所は以下のようなコードでした。

<?php
if (is_search()) { // 検索結果ページなら検索件数を出す
    $allsearch = & new WP_Query("s=$s&showposts=-1");
    $key = wp_specialchars($s, 1);
    $count = $allsearch->post_count;
    echo '<h1>&#8216;' . $key . '&#8217; で検索した結果:' . $count . ' 件</h1>';
}
?>

そもそも当サイトはサイト内検索にGoogleカスタム検索を使用しており該当箇所は不要となっていたため削除しました。

これでめでたくPHP7でWordPressが動作するようになりました。

PHP7インストール後

$ php -v
PHP 7.0.6 (cli) (built: Apr 28 2016 22:35:28) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

PHP7にして速くなった?

結論としては当サイトではページ表示の体感速度は変わりませんでした。

PHP5.5の場合とPHP7.0.6の場合のGTmetrix結果は以下のとおりです。

PHP5.5

gtmetrix PHP5.5 score

PHP7.0.6

gtmetrix PHP7.0.6 score

Pagespeed ScoreとYslow Scoreが両方共1%上がっていますが、誤差の範囲だと思います。Page Load Timeは15秒ほど早くなっていますがこれも複数回計測したわけではないので、PHP5.5のとき一時的に遅かっただけではないかと思います。

おわりに

ほとんど自己満足で終わったような気がしますが、投稿やメール送信なども今のところ問題ないのでPHP7でもWordPressは普通に動作するようで一安心です。