ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.
Problem 1 - Installation request for phar-io/manifest 2.0.3 -> satisfiable by phar-io/manifest[2.0.3]. - phar-io/manifest 2.0.3 requires ext-xmlwriter * -> the requested PHP extension xmlwriter is missing from your system.
コアサーバーでlaravelの「composer install」コマンドを実行しようとするとこんなのがズラズラ。4つくらい。
どのProblemを見てもぜんぶ2行目には「ext-xmlwriterがないよ!」って怒ってます。んでこのxmlwriterっていうのはphpのextensoinだよ。っていってます。
とりあえずここまでにもいろいろ別の問題で詰まってたんでextensionっていうのがphp.iniで有効無効を切り替えられるやつっていうのはわかってたんですが…、
ふーん、それ以外ほぼわからない。
という事で調べてみました。結局バッチリ解決できたんで参考にしてみてくださいね。
xmlwriterがない
コアサーバーではphpのバージョンが選べて、んでコマンドラインでphpを使うときはcli版っていう機能の多い方を使うはずなんです。コアサーバーで普通に「php」とだけコマンドラインに入力するとcgi版のphpが動くので、そうじゃなくて「/usr/local/bin/php80cli」みたいにコアサーバー内のcli版phpがある場所を明示して叩く感じになります。
話が少々脱線しましたが、このcli版php、コアサーバーではphp71cliまでしかxmlwriterが有効になってないんです。
なんで?有効にするの忘れた?コアサーバーさん?という感じなんですが、コアサーバーではcgi版のはできてもcli版のはphp.iniを編集できないようなので後からxmlwriterを有効にすることができないっぽいのです。
解決方法
いろんな記事を読んでいると自分でphpをmakeして、xmlwriter付きのphpを作っちゃう方などがいたのですが、今回はそれをしなくて済む解決方法です(というか実はそれもしたんですがエラーで無理だったんですよね…)。
/usr/local/bin/php72cli -d extension=/usr/local/lib/php/extensions/php72_xmlwriter.so 【実行したい処理】
「-d extension=/usr/local/lib/php/extensions/php72_xmlwriter.so」を追加するだけでOK。php72のところの72は使いたいphpバージョンに変えてくださいね。
例えば私のやりたかった作業である、php8で「composer install」をする場合だと、
/usr/local/bin/php80cli -d extension=/usr/local/lib/php/extensions/php80_xmlwriter.so composer.phar install
となります。
- ちょっと勉強:phpのコマンドラインオプション「-d」について
-
phpのコマンドラインオプション「-d」の意味についてちょっとおさらいしておきますね。
phpのコマンドラインオプション「-d」は「この設定を後乗せサクサクしちゃってね!」というオプションになってます。今回の場合だとphp.iniではxmlwriterがコメントアウトされてて無効になってる(はず)なんですが、「いやいやphpさん、今回は後乗せサクサクでこの場所にあるxmlwriter使っちゃってね」と指定してます。
- ちょっと勉強2:拡張子「so」について
-
「php80_xmlwriter.so」の末尾の拡張子「so」ってなんなんだろう?って疑問ですよね。
調べてみるとlinuxの実行ファイルのことらしいです。windowsでいうとexe的な?そんな感じでOKだと思います。
その他Tips
てことで自分でphpをmakeやらmake installしなくてもxmlwriterを外部ファイルとして?コアサーバーさんは用意して置いてくれてるんですね。ありがたいです。なのでxmlwriterが必要な処理の場合は「-d」でxmlwriter.soファイルを後乗せで使う用に指示して上げればOK、と。そんな感じです。
…ただそれなら最初からphp本体の方にxmlwriterを入れておいて欲しい気もしますが、なにか理由があるんだと思います。
んでその過程で知ったちょっと便利な技を。
phpinfo()にエクステンションの場所が書かれている
普段phpinfo()ってみないですよね。
なんかHTMLに貼り付けて表示っていうのがめんどうで。
はい、そんな時は「php -i」です。コアサーバーの場合はこうですね。
/usr/local/bin/php80cli -i
これでphpinfo()の表示がコマンドプロンプト上にずらずらーと表示されちゃいます。
ただ恐ろしく見づらい。てことで目的の項目だけ抜き出す「| grep」を一緒に使うといいみたいです。linuxってこういうパイプ処理?っていうのか異なるコマンドを組み合わせて使うのが多いですよね。いまだに「|」なのか他のパイプ処理のきごうつかうのがいいのかよくわかってない…。
はい。んでphpini()に書かれているextensionの場所はそのままズバリ「extension_dir」らしいので、
/usr/local/bin/php80cli -i | grep -i extension_dir
としてやればその環境でのxmlwriter.soなんかが保存されているディレクトリが分かるって寸法です。
今回のはコアサーバーでのやり方になっていますが、他のサーバーでもまず上のphpinfo()をgrepしてあげて、エクステンションの保存先を調べて、んでその場所を見に行ってxmlwriter.soがあれば「-d」オプションで後乗せしてあげれば動くと思います。
“extention”じゃない!
あとこんなドジな間違いしないと思いますが、個人的にここでいったん諦めたくらい詰まったんで注意を。
“extention”じゃなくて”extension”です。「s」なのでそこだけ注意。
「-d」でxmlwriter.soを有効にしているのにずーっと記事冒頭のエラーが出続けちゃって、んで諦めて不貞腐れながら寝て、へんなソースコードの悪夢を見て、んで朝。
昨日の夜の詰まりがうそのように、「あれ?tじゃないじゃん、sじゃん」で解決。…できれば夜のうちに気づけて、いい夜を過ごして、そして悪夢なく寝たかったです。
まとめ
今回はコアサーバーでphpをコマンドライン使用している際に、xmlwriterがないよ!とエラーになっちゃったときの解決方法を書きました。
まとめると、
- コアサーバーではphp72以降、xmlwriterがphp.iniで無効にされていて、またユーザーはphp.iniを編集できない(cgi版はphp.ini編集可能)
- なので「-d」オプションでxmlwriterを後乗せ有効する。xmlwriterは過去は自分でmakeして用意する必要があったらしいけれど、今は「/usr/local/lib/php/extensions/」に各バージョンごとに用意してくれているのでこれが使える
という事でした。参考にしてみてください。
【おしらせ、というか完全なる宣伝】
文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.
こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /