ショウジンブログ

Learn as if you will live forever, Live as if you will die tomorrow.

PHPのdate.timezoneがno value@Nginx

Sponsored Links

EX CLOUD(プランはEX LITE)で使っているnginx + php-fpmで時間(date.timezone)が合っていなかったのでこれに対応したメモ。

わりとハマりました。

まず、phpinfo()でdate.timezoneを確認するとno valueでした。これをAsia/Tokyoにすればよさそうっていうのはすぐわかったんですが、そうすんなりとはいかず。

この設定(date.timezone)はphp.iniでやることはわかりました。

php.iniの場所はphpinfo()で「Loaded Configuration File」の部分で確認できます。

$ sudo vim /etc/php.ini

で開いて、コメントアウトされていた「;date.timezone =」の部分を「date.timezone = “Asia/Tokyo”」に変更して保存。

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"

設定を有効化するためにnginxを再起動。(restartだとたまに有効にならないことがあるのでstopしてstart)

$ sudo /etc/init.d/nginx stop
$ sudo /etc/init.d/nginx start

再度phpinfo()で同項目を確認するも、変化なく「no value」状態。

grepで確認してみると

$ php -i | grep timezone
Default timezone => Asia/Tokyo
date.timezone => Asia/Tokyo => Asia/Tokyo

Default timezoneもdate.timezoneも設定したタイムゾーンになってます。なのになぜ?ホワイ?

一時間ほど調べて以下に辿り着きました。

stackoverflow.com

今回のこれにはphp-pearは関係ないのでは?と思いつつも、これに倣ってphp-pear、gcc、timezonedbをyumでインストール。

$ sudo yum install php-pear
$ sudo yum install gcc
$ sudo pecl install timezonedb

インストールしたらphp-fpmを再起動。(nginxのほうを再起動する必要はないみたい)

$ sudo /etc/init.d/php-fpm restart

phpinfo()を確認。

今度は「Asia/Tokyo」になっていることが確認できました。実際にPHPのdate関数を使って出力する日時でもタイムゾーンが合っていることを確認。

stackoverflowのAnswerにもありますが、timezonedbをインストールした際に最後に出るメッセージで

You should add “extension=timezonedb.so” to php.ini

というのがありますが(php.iniにextension=timezonedb.soを追加しなさいという)これはしなくても設定が反映されました。

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門