phar使ってたら Segmentation fault するようになった時の対応

多分レアケースなんでしょうが、pharファイルを複数読み込むようにPHPを書いたところ、以下のようなエラーを吐いて死んでしまうケースを確認しました。


[Mon Jan 22 23:00:10.867387 2018] [core:notice] [pid 966] AH00052: child pid 1024 exit signal Segmentation fault (11)

具体的には、同名のpharファイルを読み込む箇所で発生していました。そして、そのpharは特に指定がなければ内部の main.php を読むようにpharファイルをビルドしておりましたので、パス指定からは省略していました。

require_once 'phar://xxx/bundle.phar';
require_once 'phar://yyy/bundle.phar';

すると、冒頭に記述した通り、セグメンテーションフォルトが発生してしまう環境があるようでした。 具体的には、PHP5.3とPHP5.4のDocker環境で再現しました。レンタルサーバのロリポップのPHP5.6ではエラーになりませんでした。 また、どちらか片方だけの読み込みであればエラーになりません。

エラーログにこれ以上の詳細な情報が記録されない上に、pharに関するネット上の情報が極端に少ないということもあり、調査は難航しましたが、最終的に main.php も省略せずに指定すれば通ることが判明しました。

require_once 'phar://xxx/bundle.phar/main.php';
require_once 'phar://yyy/bundle.phar/main.php';

めでたしめでたし。