2015.02.03

PHP5.1.0以降で発生するDATE関数エラーについて

PHPには、日時を取得するDATE関数というものがあります。
このDATE関数の簡単な使い方として、日時を取得して、指定した日付文字列で返すというものです。
例えば、

<?php echo date('Y'); ?>

とすると、4桁の数字で年が出力されます。(例:2015)
よくWebサイトのコピーライト部分に使用されており、年が変わる度にコピーライト部分の編集をする必要がなくなるので、とても有り難い関数です。

そのDATE関数を使っているWebサイトのApacheエラーログを確認したところ、下記のようなエラーが記録されていました。

[日付] [error] [client 接続元IPアドレス] PHP Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /var/www/html/ファイル名.php on line 88

原因としては、PHP5(PHP5.1.0以降)から仕様変更が行われたようで、デフォルトタイムゾーンを設定せずDATE関数を使用するとエラーが発生するようです。
重大なエラーではありませんが、Apacheのエラーログに大量に記録されたり、間違った日付を取得してしまう可能性があるため、解決するのが一番。そもそもエラーをそのままにしておくのは、良いことではありませんので。

このDATE関数のエラー解決方法は、
「PHPファイル内にdate_default_timezone_set関数を記述する方法」と、
「php.iniにdate.timezoneを設定する方法」の二通りがあります。

PHPファイル内にdate_default_timezone_set関数を設定する方法

とても簡単な方法ですが、DATE関数を使用するPHPファイル内に下記の通り記述します。

date_default_timezone_set('Asia/Tokyo');

これでDATE関数エラーは発生しなくなります。

php.iniにdate.timezoneを設定する方法

php.iniにタイムゾーンを設定することで、date_default_timezone_set関数を使わなくても、DATE関数エラーを解決することができます。

まずは、php.iniの場所を確認します。
php -i でphpinfo()と同じようにPHP情報を閲覧することができます。
また、ファイル内から指定した文字列を検索するgrepコマンドを組み合わせることで、ファイル内の必要な部分のみ表示させることができます。
では、php.iniの場所を確認するので下記のように入力します。

[root@ ~]# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in Unknown on line 0

php.iniの場所が /etc/php.ini にあると確認できました。
次に、php.iniのタイムゾーン設定がどうなっているのか確認します。

[root@ ~]# php -i | grep timezone
PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in Unknown on line 0
Default timezone => Asia/Tokyo
date.timezone => no value => no value

「date.timezone => no value => no value」となっていますので、date.timezoneにタイムゾーンの設定がされていないということが確認できました。
それでは、php.iniの中にあるdate.timezoneの設定を行いましょう。
まずは、php.iniを開きます。

[root@ ~]# vi /etc/php.ini

次にphp.iniの中から、下記の項目を探します。

[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
;date.timezone =

「;date.timezone =」の下の行に、「date.timezone = Asia/Tokyo」と入力します。

[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
;date.timezone =
date.timezone = Asia/Tokyo

php.iniの編集は、以上で終了です。編集を終了して、ファイルを上書き保存してください。
変更内容に問題ないか、チェックします。Syntax OKと表示されれば問題ありません。
また、Apacheを再起動させます。

[root@ ~]# service httpd configtest
Syntax OK
[root@ ~]# service httpd restart

以上で、DATE関数のエラーが発生しなくなります。

まとめ

簡単な解決方法ですが、参考になれば幸いです。

記事カテゴリー:php