コアサーバーのphp7.4で無理やりxmlwriterを有効にする方法

PHP コアサーバー サービス プログラミング

2020年2月現在、コアサーバーのphp7.2以降ではxmlwriterが有効になっていません。

このためphp7.2以降の環境でxmlwriterを必要とするパッケージ類がcomposerでインストールできません。

インストールしようとすると以下のようなエラーが出ます。

$ php74cli composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - phpunit/phpunit 8.5.x-dev requires ext-xmlwriter * -> the requested PHP extension xmlwriter is missing from your system.
    - phpunit/phpunit 8.5.2 requires ext-xmlwriter * -> the requested PHP extension xmlwriter is missing from your system.
    - phpunit/phpunit 8.5.1 requires ext-xmlwriter * -> the requested PHP extension xmlwriter is missing from your system.
…

xmlwriterが無効なためパッケージがインストールできないという内容です。

そのうちコアサーバー側で対応してもらえるかもしれませんが、いつになるか分からないので自力で強引にxmlwriterを有効にしてみます。

この方法はcli版phpのみ使えると思います。

fcgi版phpはiniファイルのextensionの項目をいじれないため、今の所解決策は思いつきません。

コアサーバーのphp7.2以降でxmlwriterを有効にする手順

今回の解決方法は以下です。

  1. 最新のphpをソースコードからコンパイルする
  2. コンパイルして出来たxmlwriter.soをcli版php実行時に使う

コアサーバーのphp7.2以降でも使えるxmlwriter.soを手に入れるには、phpごとコンパイルしてそこからxmlwriter.soを取り出す必要があります。

xmwriterはphp5.1.2以降はphp本体に組み込まれるようになったため、xmlwriter単体では入手できません。

その旨は以下のURLで確認できます。

PHP: インストール手順 – Manual

以下、phpをコンパイルしてxmlwriterを有効にする手順を細かく書きます。

phpの最新版をソースからコンパイルする

php7.4のソースコードを入手し、手動でコンパイルします。

ソースからコンパイルする方法は以下でも書いています。

任意の作業ディレクトリに移動し、以下のコマンドを打っていきます。

$ wget -q https://www.php.net/distributions/php-7.4.2.tar.gz
$ tar zxvf php-7.4.2.tar.gz
$ cd php-7.4.2
$ ./configure --enable-xmlwriter=shared 
$ make

configureに--enable-xmlwriter=sharedをつけることで、modules/xmlwriter.soが出力されるのでこれを使います。

php7.2や7.3を使いたい場合はバージョンの部分を適宜読み替えてください。

コンパイルして出来たxmlwriter.soをcli版phpで使う

cli版phpを実行する時に、コンパイルして出来たxmlwriter.soを指定します。

$ php74cli -d extension=※※※/php/php-7.4.2/modules/xmlwriter.so composer.phar install  

これでxmlwriterが必要なパッケージもインストールできるかと思います。

php本体もコンパイルしたものを使っても良いと思いますが、パスを通すなど不要な手間がかかるため試していません。

ダメな方法1:php実行時にインストール済のxmlwriterを有効にする

同じことをして困る人がいるかもしれないので、上手くいかなかった方法も書きます。

コアサーバー内に古いphp用のxmlwriter.soが既に存在するのでそれを利用してみます。

以下のように、cli版phpの実行時に-dオプションでxmlwriterのエクステンションを有効にしてみます。

$ php74cli -d extension=/usr/lib64/php/modules/xmlwriter.so composer.phar install
PHP Warning:  PHP Startup: xmlwriter: Unable to initialize module
Module compiled with module API=20160303
PHP    compiled with module API=20190902
…

コアサーバーにインストールされているxmlwriter.soとphpのAPIバージョンが一致しないため動かないようです。

ダメな方法2:xmlwriterのみを自力でコンパイルする

xmlwriterを単体でビルドしてsoファイルを入手する方法もうまくいきません。

peclで管理されているソースはメンテナンスされておらず、php7の環境ではコンパイルエラーになります。

xmlwriterのページには以下の記載があります。

This package is not maintained anymore and has been superseded. Package has moved to channel http://www.php.net/xmlwriter package XmlWriter in Core.

このパッケージはもうメンテナンスされておらず、置き換えられています。パッケージは、コアのチャネルhttp://www.php.net/xmlwriterパッケージXmlWriterに移動しました。

PECL :: Package :: xmlwriter

コアサーバー上でコンパイルしようとすると以下のようなエラーになります。

$ make
***/xmlwriter-2.0.4/php_xmlwriter.c:35:28: error: unknown type name 'zend_rsrc_list_entry'
 static void xmlwriter_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
                            ^
***/xmlwriter-2.0.4/php_xmlwriter.c:353:28: error: unknown type name 'zend_rsrc_list_entry'
 static void xmlwriter_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
                            ^
***/xmlwriter-2.0.4/php_xmlwriter.c: In function 'php_xmlwriter_string_arg':
***/bredge.coresv.com/xmlwriter-2.0.4/php_xmlwriter.c:384:30: error: expected expression before 'xmlwriter_object'
   ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
…

zend_rsrc_list_entryという型はphp7では廃止されているため、コンパイルできません。

php7でもコンパイルが通るようにソースコードを修正するという方法も考えられますが、どれだけの手間になるか分からないのであきらめました。

コアサーバーのphp7.2以降で無理やりxmlwriterを有効にする方法は以上です。

コメント/ピンバック

  1. 通りすがり より:

    こんにちは。
    当方初心者なのですが、任意の作業ディレクトリに移動しPHPの最新版をコンパイルしたらそのxmlwriterが入っているソースコードは作業ディレクトリの中だけで有効ですか?

    • mrkmyki mrkmyki より:

      こんにちは。

      phpの実行時にエクステンションのパスを正しく指定していれば、ディレクトリの場所は関係なく使えるかと思います。

タイトルとURLをコピーしました