VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで

CentOS6でPHP5.3からPHP7.1へアップデート

WordPressの動産環境においては、PHPのバージョン7以上が推奨とされています。
Remiリポジトリを導入し、PHP5.3からPHP7.1へアップデートした際の手順、注意点をまとめました。なお、ここではまずPHP5.3からPHP5.6へアップデートしてWordPressなどの動作確認を行い、その後PHP5.6から7.1へアップデートを行っています。

※目次をクリックすると目次の下部にコンテンツが表示されます。

PHPバージョンアップに伴う変更点
オンラインマニュアルにPHPバージョンアップに伴う変更点が記載されています。
 
私は、記載されている量が多く事前に問題ないか判断することが出来なかったので、検証環境で実際にアップデートを行いWordPressなどで動作確認を行って問題ないか評価しました。
 
以下オンラインマニュアルに目を通した際の抜粋、メモ書きです。
 
●PHP 5.3.x から PHP 5.4.x への移行
http://php.net/manual/ja/migration54.php
 
・PHP 5.4.x で改良された点のほどんどは、既存のコードに影響を及ぼさない。
 
〇互換性がない変更
http://php.net/manual/ja/migration54.incompatible.php
 
●PHP 5.4.x から PHP 5.5.x への移行
http://php.net/manual/ja/migration55.php
 
・PHP 5.5.x で改良された点のほどんどは、既存のコードに影響を及ぼさない。
 
〇互換性がない変更
http://php.net/manual/ja/migration55.incompatible.php
 
●PHP 5.5.x から PHP 5.6.x への移行
http://php.net/manual/ja/migration56.php
 
・PHP 5.6.x で改良された点のほどんどは、既存のコードに影響を及ぼさない。
 
〇互換性がない変更
http://php.net/manual/ja/migration56.incompatible.php
・配列リテラルを用いてクラスのプロパティに配列を設定した場合、配列のキーが上書きされない。
・json_decode() が、より厳格に。
 
●PHP 5.6.x から PHP 7.0.x への移行
http://php.net/manual/ja/migration70.php
 
・PHP 7.0 は新しいメジャーバージョンではあるが、 過去のバージョンからの移行をできるだけスムーズに行えるよう心がけている。
・このリリースで主に注力したのは、これまでのバージョンで廃止予定とされていた機能の削除や、 言語としての一貫性の向上。
 
〇互換性がない変更
http://php.net/manual/ja/migration70.incompatible.php
 
・エラーや例外の取り扱いの変更。
 fatal error や recoverable fatal error の多くが、PHP 7 では例外に変換されるようになった。自作のエラーハンドラは呼び出されなくなる (Error 例外をキャッチしなかった場合は、fatal エラーが発生する)。
 
・変数の取り扱いの変更。
 変数やプロパティそしてメソッドへの間接的なアクセスを、厳密に左から右の順で評価するようになった。
 
・ereg* 系のすべての関数を削除。PCRE を使うことを推奨
http://php.net/manual/ja/book.regex.php

・すべての ext/mysql 関数を削除。
http://php.net/manual/ja/book.mysql.php
MySQL API の選択については以下を参照。
http://php.net/manual/ja/mysqlinfo.api.choosing.php
 
・ASP タグと script タグの廃止
 
・$HTTP_RAW_POST_DATA の削除。代わりに php://input ストリームを使う。
 
●PHP 7.0.x から PHP 7.1.x への移行
 
・このマイナーバージョンアップには数多くの新機能がある。
 
〇互換性がない変更
http://php.net/manual/ja/migration71.incompatible.php

Remiリポジトリのインストール
CentOS標準のリポジトリではPHPの新しいバージョンには対応していないため、Remiリポジトリを使ってPHPのバージョンアップを行います。
 
Remiリポジトリを使用するにはEPELリポジトリが必要なのでEPELリポジトリもインストールします。
※English : Repository Configuration – Remi’s RPM repository – Blog
 
●EPELリポジトリインストール
 
# yum install epel-release
 
●Remiリポジトリインストール
 
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
PHP5.3からPHP5.6へアップデート
Remiリポジトリを使ってPHP5.3からPHP5.6へアップデートした際の実行例です。
# yum update --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-mysql

Installed:
  php-mysqlnd.i686 0:5.6.31-1.el6.remi

Dependency Installed:
  gd-last.i686 0:2.2.4-1.el6.remi
  libevent2.i686 0:2.0.21-2.el6
  libwebp.i686 0:0.4.3-3.el6
  libzip5.i686 0:1.2.0-1.el6.remi
  php-gmp.i686 0:5.6.31-1.el6.remi
  php-google-recaptcha.noarch 0:1.1.3-1.el6.remi
  php-pecl-apfd.i686 0:1.0.1-1.el6.remi.5.6
  php-pecl-json-post.i686 0:1.0.1-1.el6.remi.5.6
  php-pecl-jsonc.i686 0:1.3.10-2.el6.remi.5.6
  php-pecl-jsonc-devel.i686 0:1.3.10-2.el6.remi.5.6
  php-pecl-zip.i686 0:1.15.1-1.el6.remi.5.6
  php-phpmyadmin-motranslator.noarch 0:3.3-1.el6.remi
  php-phpmyadmin-shapefile.noarch 0:2.1-1.el6.remi
  php-phpmyadmin-sql-parser.noarch 0:4.1.8-1.el6.remi
  php-phpseclib.noarch 0:2.0.6-1.el6.remi
  php-recode.i686 0:5.6.31-1.el6.remi
  php-symfony-class-loader.noarch 0:2.8.24-1.el6.remi
  php-symfony-common.noarch 0:2.8.24-1.el6.remi
  php-symfony-expression-language.noarch 0:2.8.24-1.el6.remi
  php-udan11-sql-parser.noarch 0:3.4.17-2.el6.remi
  recode.i686 0:3.6-28.1.el6
  t1lib.i686 0:5.1.2-6.el6_2.1

Updated:
  php.i686 0:5.6.31-1.el6.remi             php-devel.i686 0:5.6.31-1.el6.remi
  php-mbstring.i686 0:5.6.31-1.el6.remi    php-pdo.i686 0:5.6.31-1.el6.remi

Dependency Updated:
  php-bcmath.i686 0:5.6.31-1.el6.remi
  php-cli.i686 0:5.6.31-1.el6.remi
  php-common.i686 0:5.6.31-1.el6.remi
  php-gd.i686 0:5.6.31-1.el6.remi
  php-mcrypt.i686 0:5.6.31-1.el6.remi
  php-pecl-http.i686 0:2.6.0-1.el6.remi.5.6
  php-pecl-propro.i686 0:1.0.2-1.el6.remi.5.6
  php-pecl-raphf.i686 0:1.1.2-1.el6.remi.5.6
  php-process.i686 0:5.6.31-1.el6.remi
  php-tcpdf.noarch 0:6.2.13-1.el6.remi
  php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.13-1.el6.remi
  php-tidy.i686 0:5.6.31-1.el6.remi
  php-xml.i686 0:5.6.31-1.el6.remi
  phpMyAdmin.noarch 0:4.7.2-1.el6.remi

Replaced:
  php-mysql.i686 0:5.3.3-49.el6

Complete!
PHP5.6からPHP7.1へアップデート
Remiリポジトリを使ってPHP5.3からPHP5.6へアップデートした際の実行例です。
# yum update --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-mysql

Installed:
  php-devel.i686 0:7.1.7-1.el6.remi       php-json.i686 0:7.1.7-1.el6.remi      

Dependency Installed:
  libicu-last.i686 0:50.1.2-11.el6.remi                                         

Updated:
  php.i686 0:7.1.7-1.el6.remi            php-mbstring.i686 0:7.1.7-1.el6.remi   
  php-mysqlnd.i686 0:7.1.7-1.el6.remi    php-pdo.i686 0:7.1.7-1.el6.remi        

Dependency Updated:
  php-bcmath.i686 0:7.1.7-1.el6.remi                                            
  php-cli.i686 0:7.1.7-1.el6.remi                                               
  php-common.i686 0:7.1.7-1.el6.remi                                            
  php-gd.i686 0:7.1.7-1.el6.remi                                                
  php-gmp.i686 0:7.1.7-1.el6.remi                                               
  php-mcrypt.i686 0:7.1.7-1.el6.remi                                            
  php-pecl-apfd.i686 0:1.0.1-8.el6.remi.7.1                                     
  php-pecl-http.i686 0:3.1.0-1.el6.remi.7.1                                     
  php-pecl-json-post.i686 0:1.0.1-6.el6.remi.7.1                                
  php-pecl-propro.i686 0:2.0.1-3.el6.remi.7.1                                   
  php-pecl-raphf.i686 0:2.0.0-3.el6.remi.7.1                                    
  php-pecl-zip.i686 0:1.15.1-1.el6.remi.7.1                                     
  php-process.i686 0:7.1.7-1.el6.remi                                           
  php-recode.i686 0:7.1.7-1.el6.remi                                            
  php-tidy.i686 0:7.1.7-1.el6.remi                                              
  php-xml.i686 0:7.1.7-1.el6.remi                                               

Replaced:
  php-pecl-jsonc.i686 0:1.3.10-2.el6.remi.5.6                                   
  php-pecl-jsonc-devel.i686 0:1.3.10-2.el6.remi.5.6                             

Complete!
WordPressで発生した不具合
PHP7.1へアップデート後にWordPress(バージョン4.5.9)で動作確認した際、下記の不具合が発生しました。
 
いずれもWordPressのバージョンが古かったためのようでバージョン4.7.1へ更新したら解決されました。
 
〇管理インタフェースにログインできない
PHP Fatal error:  Uncaught Error: Cannot create references to/from string offsets in /var/www/html/wp/wp-includes/user.php:56
Stack trace:
#0 /var/www/html/wp/wp-login.php(784): wp_signon('', '')
#1 {main}
  thrown in /var/www/html/wp/wp-includes/user.php on line 56

WordPressのバージョンが4.5.9と古かったからのようです。
WordPress4.7.1では解決されているようです。
https://core.trac.wordpress.org/ticket/37071
https://github.com/roots/bedrock/issues/289
 
以下の方法で暫定対応してログインできるようにし、WordPressをアップデートして解決できました。
# vi wp-login.php
 
$user = wp_signon( ”, $secure_cookie );
 ↓
$user = wp_signon( array(), $secure_cookie );
 
〇plugin.phpに関わる警告
Warning: Parameter 1 to wp_default_scripts() expected to be a reference, value given in /var/www/html/wp/wp-includes/plugin.php on line 601
Warning: Parameter 1 to wp_default_styles() expected to be a reference, value given in /var/www/html/wp/wp-includes/plugin.php on line 601
 
これもWordPressのバージョンが4.5.9と古かったからのようで、WordPress4.7では解決されているようです。

SSH2拡張が使用できなくなる不具合
PHP5.6、PHP7.1へアップデート後、SSH2拡張が使用できなくなり、プラグインの更新などが実行できなくなりました。
※SSH2拡張については以下の記事参照。
WordPressでFTP接続情報が表示、SSH転送で回避
 
●peclのssh2はPHP7は非対応?
 
peclのssh2を更新しようとすると以下のエラーが発生しました。
 
pecl/ssh2 requires PHP (version >= 4.0.0, version ●yumでphp-pecl-ssh2をインストール
 
php-pecl-ssh2をインストールしたら解決できました。
 
# yum install --enablerepo=epel,remi,remi-php71 php-pecl-ssh2
・・・
Installed:
  php-pecl-ssh2.x86_64 0:1.1.2-1.el6.remi.7.1

Complete!
 
# rpm -ql php-pecl-ssh2
/etc/php-zts.d/40-ssh2.ini
/etc/php.d/40-ssh2.ini
/usr/lib64/php-zts/modules/ssh2.so
/usr/lib64/php/modules/ssh2.so
/usr/share/doc/pecl/ssh2
/usr/share/doc/pecl/ssh2/LICENSE
/usr/share/doc/pecl/ssh2/README.md
/var/lib/pear/pkgxml/php-pecl-ssh2.xml

# more /etc/php.d/40-ssh2.ini
; Enable ssh2 extension module
extension=ssh2.so
モバイルバージョンを終了