PHP Fatal error: Uncaught Error: Call to undefined function mb_convert_encoding()
「上記のようなエラーが出てしまう・・・」
「PHPでmbstring関数を利用したい」
このような場合には、この記事が参考となります。
この記事では、PHPでmbstring関数を利用するための方法を解説しています。
本記事の内容
- mb_convert_encoding()でエラーが出る原因
- PHP mbstring拡張モジュール(php-curl)のインストール
- PHP mbstring拡張モジュールの有効化
- mbstring関数の動作確認
それでは、上記に沿って解説していきます。
mb_convert_encoding()でエラーが出る原因
mb_convert_encoding()のエラーが出るとは、PHPでmbstring関数が使えないということです。
PHPでmbstring関数が使えない原因は、以下の2つが考えられます。
- PHP mbstring拡張モジュールがインストールされていない
- PHP mbstring拡張モジュールが有効化されていない
それぞれを下記で説明します。
PHP mbstring拡張モジュールがインストールされていない
まずは、mbstring拡張モジュールの未インストールを疑いましょう。
インストールの有無は、次の方法で確認できます。
$ ls /usr/lib/php/20190902 | grep mbstring
mbstring拡張モジュールが存在していれば、共有ライブラリが存在しています。
あとは、パッケージのインストール状況を確認する方法があります。
$ apt list php-mbstring 一覧表示... 完了 php-mbstring/groovy,groovy 2:7.4+76 all
パッケージ管理システムでは、該当パッケージの認識はされています。
しかし、まだインストール済みではありません。
インストール済みの場合、[インストール済み]と記載されます。
PHP mbstring拡張モジュールが有効化されていない
インストールしただけでは、mbstring関数は使えません。
PHP mbstring拡張モジュールを有効化して初めて、mbstring関数可能となります。
PHP mbstring拡張モジュールの状況は、以下の方法で確認できます。
- 「php -m」でロードされているモジュール一覧を確認する
- 「phpinfo()」で出力される情報から確認する
それぞれの方法で確認してみましょう。
「php -m」でロードされているモジュール一覧を確認する
モジュール一覧をgrepします。
$ php -m | grep 'mbstring'
PHP mbstring拡張モジュールが有効化されていれば、「mbstring」と表示されます。
「phpinfo()」で出力される情報から確認する
phpinfo()の結果を確認する方法です。
同様に、grepコマンドを使います。
$ php -r 'phpinfo();' | grep 'mbstring' Multibyte decoding support using mbstring => disabled
デフォルトでは、利用不可となっています。
まとめ
mbstring拡張モジュールの状況を確認しました。
すでにインストール済みなら、あとはそれを有効化するだけです。
インストールがまだなら、まずはインストールから行います。
以下では、インストール・有効化の方法をそれぞれ説明します。
PHP mbstring拡張モジュール(php-mbstring)のインストール
インストールするパッケージを確認します。
パッケージ名は、「php-mbstring」となります。
$ sudo apt show php-mbstring Package: php-mbstring Version: 2:7.4+76 Priority: optional Section: universe/php Source: php-defaults (76) Origin: Ubuntu Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Original-Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org> Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 13.3 kB Depends: php-common, php7.4-mbstring Download-Size: 2,012 B APT-Sources: http://old-releases.ubuntu.com/ubuntu groovy/universe amd64 Packages Description: MBSTRING module for PHP [default] This package provides a MBSTRING module for PHP. . PHP (PHP: Hypertext Preprocessor の再帰的頭字語) は広く使われている オープンソースな汎用スクリプト言語で、特にウェブ開発に適しており、 HTML に組み込むことができます。 . This package is a dependency package, which depends on Debian's default PHP version (currently 7.4).
パッケージのバージョンは、PHPのバージョンによって変わってきます。
バージョンは指定しない方が適したバージョンがインストールされることになります。
よって、php-mbstringのインストールは、以下のコマンドで行います。
$ sudo apt-get install php-mbstring
インストールは、少し時間がかかります。
まずは、パッケージの状況から確認します。
$ apt list php-mbstring 一覧表示... 完了 php-mbstring/groovy,groovy,now 2:7.4+76 all [インストール済み]
[インストール済み]が、記載されるようになりました。
では、モノ(共有ライブラリ)を確認しておきます。
$ ls /usr/lib/php/20190902 | grep 'mbstring' mbstring.so
PHP mbstring拡張モジュール(php-mbstring)のインストールは、これで完了です。
PHP mbstring拡張モジュールの有効化
有効化の際には、php.iniに以下の記述を追加します。
extension=mbstring.so
しかし、今回はその必要がありません。
「/etc/php/7.4/apache2/conf.d」の下に、「/etc/php/7.4/apache2/conf.d/20-mbstring.ini」が存在しています。
$ ls /etc/php/7.4/apache2/conf.d | grep 'mbstring' 20-mbstring.ini
そして、そのファイルの内容は以下。
20-mbstring.ini
$ cat /etc/php/7.4/apache2/conf.d/20-mbstring.ini ; configuration for php mbstring module ; priority=20 extension=mbstring.so
このファイルがあるため、php.iniへの追記が不要ということです。
ここまでの処理は、php-mbstringインストールの際に自動で行われます。
では、設定を反映するためにApacheの再起動を行います。
$ sudo systemctl restart apache2
再起動が完了したら、モジュールの状況を確認しましょう。
実は、コマンドラインPHPへの反映にはApacheの再起動が不要です。
でも、一般的にはApache上でPHPの利用がメインとなります。
そのため、確認はまとめてやります。
$ php -m | grep 'mbstring' mbstring $ php -r 'phpinfo();' | grep 'mbstring' /etc/php/7.4/cli/conf.d/20-mbstring.ini, Zend Multibyte Support => provided by mbstring Multibyte decoding support using mbstring => enabled ・・・
ブラウザでも確認しておきましょう。
Apacheへの反映は、こちらでの確認が必須です。
iniファイルが認識されていることを確認。
そして、利用可能モジュールとして表示されています。
これで、PHP mbstring拡張モジュールの有効化まで終わりました。
次は、実際にmbstring関数が使えるかどうか確認します。
mbstring関数の動作確認
動作確認は、次のコードで行います。
<?php $str = "日本語"; /* 内部文字エンコーディングからSJISに変換 */ $str = mb_convert_encoding($str, "SJIS"); ?>
上記コードを実行します。
エラーが何も出なければ、成功です。
ただ、表示が何もないと正常に機能しているかどうか不明です。
エラーこそ出なくなっていますけどね。
そこで次のコードも試してみましょう。
<?php $str = "日本語"; // 現在のdetect_orderで文字エンコーディングを検出 echo mb_detect_encoding($str); ?>
上記コードを実行した結果は、以下。
各環境によって、表示される内容は異なります。
これにて、mbstring関数の動作確認は完了です。
以上、mbstring関数の動作確認を説明しました。