ブログタイトル

PHPの設定 【mbstring】

phpが表示されない時にサーバ側で行った設定をメモ。


PHPが利用できるホスティングであることは知っていたが、PHPをまだ動かしたことはないのでバージョン確認から。


■まずはバージョン確認

<?php
phpinfo();
?>


とメモ帳に記載。「test.php」などphpファイルとして保存し、webサーバにアップロード。
アップロードしたパスをアドレスバーに入力し、この「test.php」を表示させます。

以下のようにPHPの設定情報が表示されます。5.2系であることを確認。



バージョン確認だけなら、SSHで接続し以下のコマンドでもいいです。

php -v

phpinfoの情報にはphpの設定ファイル(.iniファイル)等のパスも記載されているので、後々役に立ちます。




■次にSSHでエラー情報を確認

エラーファイルは以下のパスでした。

/var/log/httpd/管理ユーザ名/

この配下にドメイン名付きのエラーログを複数世代ある。
いくつかエラーが出ていました。


(エラー1)
"[Thu Nov 14 09:00:53 2013] [error] [client xxx.xxx.xxx.23] PHP Fatal error: Call to undefined function mb_internal_encoding() in /ファイルパス/sample.php on line 18, referer: http://リファラーアドレス"


マルチバイト文字(mbstring)の内部変換(internal_encoding)でエラー発生。
マルチバイト文字(日本語の文字コード)の設定に問題がある様子。



エラー解消のため、php系のiniファイルにて設定を確認。


■.iniファイルで設定変更

先ほどのphpinfoの情報ではiniファイルは二つ。php.iniとextentions.ini

/usr/local/php5/lib/php.ini
/usr/local/php5/etc/extensions.ini

この二つを確認します。





■(エラー1)の mbstring 関連から対処

まずmbstringとのことで、最初に試みたのが「php_mbstring.dll」の拡張機能をONにすること。
php.iniを開き、

;extension=php_mbstring.dll


から「;」を消して、コメントアウトを外しました。しかしこの対処で別のエラーが出ることになりました。それは後述。


その他に併せて、[mbstring]に関連する以下の設定を変更し、コメントアウトを外しました。
【対処1】

mbstring.language = Japanese

mbstring.internal_encoding = UTF-8

mbstring.http_input = pass

mbstring.http_output = pass

mbstring.encoding_translation = Off

mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII

mbstring.substitute_character = none;

しかし、php -v コマンドを入力したら以下のエラーが。



(エラー2)

PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php5/lib/php/extensions/current/php_mbstring.dll'
- /usr/local/php5/lib/php/extensions/current php_mbstring.dll: cannot open shared object file: No such file or directory in Unknown on line 0


表示されたパス(/usr/local/php5/lib/php/extensions/current/)を確認したところ、確かに該当のファイルはなかった。
よって最初のphp_mbstring.dllにまつわる一行を再びコメントアウトに戻し、別の対策を検討することに。


設定ファイル extensions.ini のmbstringにまつわる以下の行のコメントアウトを外した。
【対処2】

extension=mbstring.so


php.iniの設定を変更した場合、apacheの再起動をしないと反映されない。
再起動を実施。

# /etc/rc.d/init.d/httpd restart


この二つの対処によって、エラーが解消した。