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を有効にする手順
今回の解決方法は以下です。
- 最新のphpをソースコードからコンパイルする
- コンパイルして出来たxmlwriter.soをcli版php実行時に使う
コアサーバーのphp7.2以降でも使えるxmlwriter.soを手に入れるには、phpごとコンパイルしてそこからxmlwriter.soを取り出す必要があります。
xmwriterはphp5.1.2以降はphp本体に組み込まれるようになったため、xmlwriter単体では入手できません。
その旨は以下のURLで確認できます。
以下、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を有効にする方法は以上です。
コメント/ピンバック
こんにちは。
当方初心者なのですが、任意の作業ディレクトリに移動しPHPの最新版をコンパイルしたらそのxmlwriterが入っているソースコードは作業ディレクトリの中だけで有効ですか?
こんにちは。
phpの実行時にエクステンションのパスを正しく指定していれば、ディレクトリの場所は関係なく使えるかと思います。