AWS RDS MySQLのtime zoneをcakePHPで設定する

【環境】

AWS RDS MySQL 5.5

【現象と要望】

AWSのRDSでMySQLサーバを起動し、日本時間2013-04-02 15:01 :00に “SELECT NOW();” を実行すると、”2013-04-02 06:01:00″と表示される。これを日本向けに”2013-04-02 15:01:00″と表示させたい。

【対応】

phpMyAdmin>変数を表示すると、time zoneはUTCであり、上記の「06:01:00」は正しい表示結果である。

time zoneを’Asia/Tokyo’または’+09:00’に設定すれば解決しそうだが、AWS Management Console>RDS>DB Parameter Groupsを見ると、default_time_zoneは変更不可と表示されている。

対応方法の一つとして、MySQLサーバ接続ごとに、またはSQL実行ごとに「SET @@time_zone=’+09:00′ 」を実行する方法がある。

cakePHP 1.2での対応例を紹介する。

※ソースそのままではなく記事用に編集してあるので、もしエラーが発生したら自分で対応してほしい。

【対応例】

(1) app/config/database.php

DATABASE_CONFIGのdriverの値をmysql_customに変更し、time_zoneを追加する。

class DATABASE_CONFIG {
    var $default = array(
        'driver'	=> 'mysql_custom',
        'persistent'	=> false	,
        'host'		=> 'localhost'	,
        'login'		=> 'user'	,
        'password'	=> 'pass'	,
        'database'	=> 'cake'	,
        'prefix'	=> ''		,
        'encoding'	=> 'utf8'	,
        'time_zone'	=> '+09:00'	,
    );

(2) app/models/datasources/dbo_mysql_custom.php

ファイルを新規作成する。

<?php
uses( 'model' . DS . 'datasources' . DS . 'dbo' . DS . 'dbo_mysql' ); 

class DboMysqlCustom extends DboMysql{
    function connect() {
        $r = parent::connect();
        if ( $r ) {
            if ( isset($this->config['time_zone']) ) {
                $qry = sprintf( "SET @@time_zone = '%s'", $this->config['time_zone'] );
                $this->query( $qry );
            }
        }
        return $r;
    }
}

?>