システム開発では時に、思いもよらないエラーに遭遇しますが、今回はSimpleXMLがインストールされていなかったサーバに追加インストール時にはまった点と解決方法です。すべてのWEBサーバに当てはまるわけではないので、参考までに。
最初に下記のコマンドで、モジュールがインストールされているか確認します。
# php -m
[PHP Modules]
bz2
calendar
Core
ctype
curl
date
ereg
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
igbinary
json
libxml
mbstring
mcrypt
mhash
mysql
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
redis
Reflection
session
sockets
SPL
sqlite3
standard
tokenizer
xdebug
Zend OPcache
zip
zlib
[Zend Modules]
Xdebug
Zend OPcache
確かに、simplexmlは入っていません。
# php -v
PHP 5.6.36 (cli) (built: Apr 25 2018 10:11:47)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
PHPは5.6.36であることが分かります。
とりあえず、yumでインストールを試みる、
# yum install simplexml
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main | 2.1kB 00:00:00
amzn-updates | 2.5 kB 00:00:00
16 packages excluded due to repository priority protections
パッケージ simplexml は利用できません。
エラー: 何もしません
インストールできない。。。
そこで、php-xmlをインストールしてみる。
# yum install php-xml
読み込んだプラグイン:priorities, update-motd, upgrade-helper
16 packages excluded due to repository priority protections
依存性の解決をしています
–> トランザクションの確認を実行しています。
—> パッケージ php-xml.x86_64 0:5.3.29-1.8.amzn1 を インストール
–> 依存性の処理をしています: php-common(x86-64) = 5.3.29-1.8.amzn1 のパッケージ: php-xml-5.3.29-1.8.amzn1.x86_64
–> 依存性解決を終了しました。
エラー: パッケージ: php-xml-5.3.29-1.8.amzn1.x86_64 (amzn-main)
要求: php-common(x86-64) = 5.3.29-1.8.amzn1
インストール: php-common-5.6.36-1.el6.remi.x86_64 (@remi-php56)
php-common(x86-64) = 5.6.36-1.el6.remi
利用可能: php-common-5.3.29-1.8.amzn1.x86_64 (amzn-main)
php-common(x86-64) = 5.3.29-1.8.amzn1
利用可能: php54-common-5.4.45-1.75.amzn1.x86_64 (amzn-main)
php-common(x86-64) = 5.4.45-1.75.amzn1
利用可能: php55-common-5.5.38-2.119.amzn1.x86_64 (amzn-main)
php-common(x86-64) = 5.5.38-2.119.amzn1
利用可能: php56-common-5.6.35-1.137.amzn1.x86_64 (amzn-main)
php-common(x86-64) = 5.6.35-1.137.amzn1
利用可能: php56-common-5.6.36-1.138.amzn1.x86_64 (amzn-updates)
php-common(x86-64) = 5.6.36-1.138.amzn1
利用可能: php56-common-5.6.37-1.139.amzn1.x86_64 (amzn-updates)
php-common(x86-64) = 5.6.37-1.139.amzn1
利用可能: php56-common-5.6.38-1.140.amzn1.x86_64 (amzn-updates)
php-common(x86-64) = 5.6.38-1.140.amzn1
利用可能: php56-common-5.6.39-1.141.amzn1.x86_64 (amzn-updates)
php-common(x86-64) = 5.6.39-1.141.amzn1
利用可能: php56-common-5.6.40-1.142.amzn1.x86_64 (amzn-updates)
php-common(x86-64) = 5.6.40-1.142.amzn1
問題を回避するために –skip-broken を用いることができます。
これらを試行できます: rpm -Va –nofiles –nodigest
いくつか、モジュールがあったので、最新のものをインストール(もしかしたら、5.6.36のものをインストールすればこれで解決していた可能性もある??)
# yum install php56-common-5.6.40-1.142.amzn1.x86_64
→完了後に再び、# php -m で確認するも、インストールされておらず。
そこで、php.iniの設定を確認する。
# php –ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed: /etc/php.d/10-opcache.ini,
/etc/php.d/15-xdebug.ini,
/etc/php.d/20-bz2.ini,
/etc/php.d/20-calendar.ini,
/etc/php.d/20-ctype.ini,
/etc/php.d/20-curl.ini,
/etc/php.d/20-exif.ini,
/etc/php.d/20-fileinfo.ini,
/etc/php.d/20-ftp.ini,
/etc/php.d/20-gd.ini,
/etc/php.d/20-gettext.ini,
/etc/php.d/20-iconv.ini,
/etc/php.d/20-mbstring.ini,
/etc/php.d/20-mcrypt.ini,
/etc/php.d/20-mysqlnd.ini,
/etc/php.d/20-pdo.ini,
/etc/php.d/20-phar.ini,
/etc/php.d/20-sockets.ini,
/etc/php.d/20-sqlite3.ini,
/etc/php.d/20-tokenizer.ini,
/etc/php.d/30-mysql.ini,
/etc/php.d/30-mysqli.ini,
/etc/php.d/30-pdo_mysql.ini,
/etc/php.d/30-pdo_sqlite.ini,
/etc/php.d/40-igbinary.ini,
/etc/php.d/40-json.ini,
/etc/php.d/40-zip.ini,
/etc/php.d/50-redis.ini
どうやら、/etc/php.dに拡張モジュールの読込先などの設定を書いた.iniファイルをアップしていあるらしい。php.iniに直書きではない。
そこで、/etc/php.d/20-mbstring.ini というファイルをのぞいてみると
; Enable mbstring extension module
extension=mbstring.so
というように、拡張モジュールの読込を指示している。
そもそも、どこに拡張モジュールがあるのか、調べてみる
# find / -name ‘mbstring.so’
/usr/lib64/php-zts/modules/mbstring.so
/usr/lib64/php/modules/mbstring.so
2つ出てきました。
では、simplexmlは?
# find / -name ‘simplexml.so’
/usr/lib64/php-zts/5.6/modules/simplexml.so
/usr/lib64/php/5.6/modules/simplexml.so
おや、別の場所にある。。。
そこで、上記のモジュールを現在読み込まれているフォルダにコピーする
# cp /usr/lib64/php-zts/5.6/modules/simplexml.so /usr/lib64/php-zts/modules/
# cp /usr/lib64/php-zts/5.6/modules/simplexml.so /usr/lib64/php/modules/
さらに、20-mbstring.iniを変更して、20-simplexml.ini を作成して、/etc/php.dにアップする。
httpdを再起動、
# /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
でも、モジュールは表示されず、、、、
# php –ini で確認すると、下記のエラーが、
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/simplexml.so’ – /usr/lib64/php/modules/simplexml.so: undefined symbol: executor_globals_id in Unknown on line 0
この原因がなかなかわからず、権限変えたり色々やりましたが、結論としてモジュールを読み込む順番が大切でした。
simplexml.so を実行するためには、別の拡張モジュールが必要になるため、そのモジュールよりも後に拡張モジュールを読み込まないとエラーになる、ということのようです。
そこで、20-simplexml.ini を 40–simplexml.ini にファイル名を変更したところ、無事に解決しました。
今回は、システム開発というよりはサーバの設定でしたが。
備忘録としてメモしておきます。
拡張モジュールは読み込む順番も重要!!
php.iniに直書きの時も、順番を間違えるとエラーになると思われるので、注意!