【Wordpress】PHP Warning:  PHP Startup: Unable to load dynamic library 'xml.so' や undefined function simplexml_load_string()エラーの解決方法

# 概要
* テスト環境で構築したWordpressを本番環境の別サーバーに引っ越したら、「There has been a critical error on this website.」と表示されてしまうエラーに悩まされました。以下、解決に至った手順を記します（解決に導いたところだけピックアップしているわけではありません）。

## 環境
* Mac
    * 機種ID：MacBookPro18,3
    * macOS：Monterey
    * チップ：Apple M1 Pro
    * メモリ：16GB
* サーバー（AWS EC2インスタンス）
    * OS：Ubuntu 18.04.3 LTS
    * Web Server：Apache/2.4.29
    * Wordpressバージョン：6.1.1
    * PHPバージョン：7.4.33

## 前提
* 上記サーバー情報は、テスト環境でも本番環境でも同じ。
* 変なプラグインはなし（WordPress ImporterとContact Form 7しか有効化されていない）。
* 変なテーマは利用していない。推奨PHPバージョンは7.4以上で、テスト環境では正常に機能している。
* テスト環境でWordpressを無事に構築できたので以下の順序でWordpressを引っ越し。
    * 構築手順の記事はこちら：[WordpressをEC2インスタンスにインストールする方法（Apacheのバーチャルホスト設定方法・Wordpress用DB作成方法も解説）](https://qiita.com/Ryo-0131/items/a6dab55ea5b54b6e10b7)
    * Wordpress管理画面の「ツール」から「全てのコンテンツ」をエクスポート(XMLファイル)
    * 本番環境のWordpress管理画面でWordpress Importerを利用してインポート
    * テスト環境と同じ有料テーマをアップロード
        * アップロードサイズエラーが出た際はこちら：[【Wordpress】アップロード時の"upload_max_filesize"エラーと"Unable to create directory"エラーを対応](https://qiita.com/Ryo-0131/items/a0133f6e37bcb8d32592)
    * 有料テーマを利用しているので、テスト環境のテーマオプション管理からエクスポートしたJsonファイルをインポート
* ちなみに、他にもプラグインを使って引っ越しする方法がありますが、データ破損のリスクやアップロードサイズ上限、課金制度などがあったので、やめました。ちょっとトライしましたが、アップロードサイズのところがうまくできんかった。


## エラー内容
* Wordpressのリンクを開くと、どの画面でも以下のメッセージが表示されてしまうようになってしまった。これは焦る汗

```
There has been a critical error on this website. Please check your site admin email inbox for instructions.

Learn more about troubleshooting WordPress.
```

## 解決手順
* デバッグモードを`wp-config.php`で`true`にしたら、以下のエラーログが出てきた。

```
Fatal error: Uncaught Error: Call to undefined function simplexml_load_string() in /var/www/html/wpsample_homepage/wp-content/themes/fake_tcd074/functions/update_notifier.php:95 Stack trace: #0 /var/www/html/wpsample_homepage/wp-content/themes/fake_tcd074/functions/update_notifier.php(9): get_latest_theme_version() #1 /var/www/html/wpsample_homepage/wp-includes/class-wp-hook.php(308): update_notifier_menu() #2 /var/www/html/wpsample_homepage/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters() #3 /var/www/html/wpsample_homepage/wp-includes/plugin.php(517): WP_Hook->do_action() #4 /var/www/html/wpsample_homepage/wp-admin/includes/menu.php(155): do_action() #5 /var/www/html/wpsample_homepage/wp-admin/menu.php(428): require_once('/var/www/html/w...') #6 /var/www/html/wpsample_homepage/wp-admin/admin.php(158): require('/var/www/html/w...') #7 /var/www/html/wpsample_homepage/wp-admin/index.php(10): require_once('/var/www/html/w...') #8 {main} thrown in /var/www/html/wpsample_homepage/wp-content/themes/fake_tcd074/functions/update_notifier.php on line 95
```

* WordPressのテーマのファイルでエラーが発生している？っぽい。simplexml_load_string()関数という、XMLデータを読み込むために使用される拡張モジュールが有効になっていないの思われる。
* PHPのSimpleXML拡張モジュールを有効になっているかどうか、`php.ini`ファイルを確認する。
* 以下のように記載があれば有効化されているが、自分の場合は見つからなかった。

```php.ini
extension=simplexml.so
```

* では、php-xmlパッケージがそもそもインストールされていないと思い、以下を実行。

```bash
sudo apt-get install php-xml
```

* インストールしたモジュールを有効化するには`php.ini`ファイルに追記する必要がある。
* ということで、手動で`php.ini`ファイルに`extension=xml.so`を追加し、Apache再起動
    * コメントアウトされているようであれば、それを外すことで有効になる

```bash
sudo systemctl restart apache2
```

* しかし、まだ同じエラー。。。
* SimpleXML関連は、PHPをインストールすると同時に有効になるはずが、どこでおかしくなっているのだろう。XML関連の関数が含まれる拡張モジュールである"xml"が有効になっているのか確認してみよう。
* phpinfo関数を実行し、phpinfoの出力を表示してみる。
* ただし、`php -i > phpinfo.txt`を実行したら、以下のエラーが返ってきた。

```bash
PHP Warning:  PHP Startup: Unable to load dynamic library 'xml.so' (tried: /usr/lib/php/20190902/xml.so (/usr/lib/php/20190902/xml.so: cannot open shared object file: No such file or directory), /usr/lib/php/20190902/xml.so.so (/usr/lib/php/20190902/xml.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
```

* `xml.so`が正しく読み込まれていない模様。以下コマンドで検索してみる。

```bash
apt-file update
apt-file search xml.so
```

* ただし、`apt-file search xml.so`を実行しても反応なし。。。見つからんというわけか。
* `xml.so`が無いのがおかしい。さっきは`php-xml`だったから、`php-simplexml`で念の為SimpleXMLのみをインストールしてみる
    * 「php-simplexml」とは、XML文書を扱うPHPの拡張機能（組み込み関数）。下記のような違いあります
        * `php-xml`パッケージ:DOM、SimpleXML、XMLWriter、XMLReader などのPHP拡張を含む基本セット
        * `php-simplexml`パッケージ：SimpleXML拡張のみ
    * XMLは、データを構造化するためのマークアップ言語であり、Webアプリケーションやウェブサイトでよく使われます。

```bash
$ sudo apt-get install php-simplexml
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package php-simplexml is a virtual package provided by:
  php8.2-xml 8.2.4-1+ubuntu18.04.1+deb.sury.org+1
  php8.1-xml 8.1.17-1+ubuntu18.04.1+deb.sury.org+1
  php8.0-xml 1:8.0.28-1+ubuntu18.04.1+deb.sury.org+1
  php7.4-xml 1:7.4.33-5+ubuntu18.04.1+deb.sury.org+1
  php7.3-xml 7.3.33-10+ubuntu18.04.1+deb.sury.org+1
  php7.2-xml 7.2.34-38+ubuntu18.04.1+deb.sury.org+1
  php7.1-xml 7.1.33-52+ubuntu18.04.1+deb.sury.org+1
  php7.0-xml 7.0.33-65+ubuntu18.04.1+deb.sury.org+1
  php5.6-xml 5.6.40-65+ubuntu18.04.1+deb.sury.org+1
You should explicitly select one to install.

E: Package 'php-simplexml' has no installation candidate
```

* ん？正常にインストールされたのか、これ？　パッケージリストをうまく更新できてないのかな。
* php-fpmも再起動させた方が良さげか。一回`php7.4-fpm`を再起動してみよう。
    * php-fpm: FastCGIインターフェースに準拠したWebサーバーと連携し、PHPの処理を行うプロセスマネージャー(WebサーバーとPHPのプロセスが分離されるので、ダウン回避や処理高速化などのメリットがある)

```bash
$ sudo service php7.4-fpm restart

Failed to restart php7.4-fpm.service: Unit php7.4-fpm.service not found.
```

* `php7.4-fpm`という名前のsystemdサービスが見つからないよう。以下でもやってみるがエラーが出る。

```bash
$ sudo service php-fpm7.4 restart

Failed to restart php-fpm7.4.service: Unit php-fpm7.4.service not found.
```

```bash
$ ls /lib/systemd/system/php*-fpm.service

ls: cannot access '/lib/systemd/system/php*-fpm.service': No such file or directory
```

* `/lib/systemd/system/`ディレクトリにphp-fpmサービスの設定ファイルが存在しないらしい。というか、設定ファイルが破損しているのかも。
* 以下のコマンドを実行して、php-fpmパッケージもインストール。

```bash
$ sudo apt-get install php-fpm
```

* 再度、以下コマンドを実行するとちゃんと返ってきた。おっ!?

```bash
$ ls /lib/systemd/system/php*-fpm.service
/lib/systemd/system/php8.2-fpm.service
```

* php-fpmを再起動。

```bash
$ sudo systemctl restart php8.2-fpm.service
```

* WordPressのリンクを開くと、、、初期画面が出てきたぁぁぁああ！！！！！
* ということで、おそらくPHP関連パッケージをしっかりインストールできていなかったのだと思われます...解決してよかった。