勢いだけでやるページ

PHP 7.1でxmlrpc.phpにアクセスがあると、PHP-FPMがクラッシュする

概要

WordPress + nginx + PHP-FPMという構成でPHP 7.1を使用すると、xmlrpc.phpへのアクセスでPHP-FPMの子プロセスがクラッシュ(segfault)する。

発生条件と、解決法を簡単にメモする。

問題の内容

WordPressのxmlrpc.phpに対してPOSTアクセスがあると、PHP-FPMの子プロセスがsegfaultでクラッシュする。

このxmlrpc.phpへのアクセスはスパムなどによるものではなく、JetPackプラグインのサイト統計情報を表示したりするものである。
例えば、WordPressの管理画面のダッシュボードでサイト統計情報を表示するようにしていれば、管理画面を開くたびにPHP-FPMがクラッシュする。

なお、PHP-FPMの子プロセスはすぐに再起動して待ち受け状態になり、Webサーバー自体は特に問題なく使用し続けられる。

各種ログ

サーバー構成

WordPress(4.7.2) + nginx(1.10.2) + PHP-FPM(7.1.1)

その他

PHPが7.0系のときには発生しておらず、7.1系にアップデートした後に発生。

原因と解決方法

PHP 7.1が出て間もないせいか、検索しても有益な情報が少ないが、Upgrading to PHP 7.1 - erick t. hitterに記載されていることが、まさに同様の情報。

原因

PHP 7.1のOpcacheとxmlrpc.phpを組み合わせて使用すると問題が発生する(どちらが悪いのかは不明)。

解決方法

xmlrpc.phpでOpcacheを使わないようにする。

解決方法1:xmlrpc.phpを書き換え

ファイル冒頭部分にPHP実行時にOpcacheを使わないオプション値を設定する。

<?php
/**
 * XML-RPC protocol support for WordPress

<?php
ini_set( 'opcache.enable', 0 ); // Opcacheを使わない
/**
 * XML-RPC protocol support for WordPress
解決方法2:nginxの設定ファイルを変更

xmlrpc.phpへアクセスがあった際、Opcacheを使用しないオプション値をPHP-FPMへ渡す。

(この方法だと、Opcacheが一旦Disabledになってしまうと、Enabledに戻らない?)

location = /xmlrpc.php {
    fastcgi_param PHP_ADMIN_VALUE "opcache.enable=0"; # Opcacheを使わない
    include fastcgi.conf;
}

その他、注意など

更新情報

2017年4月23日
”その他、注意など”の項目を追加。