我将时区设置为php和mysql,以使我的CakePHP应用程序国际化。
当服务器接收到来自客户端的请求时,在处理请求之前,它会连接到GeoIp位置服务器并获取时区。然后我使用date_default_timezone_set()
来设置php时区。当我想设置数据库时区时,就会出现这个问题。连接Cakephp后,我需要执行类似SET time_zone='-06:00'
的sql查询。
在/lib/Cake/Model/Datasource/Database/Mysql.php中,我可以在connect()函数中看到以下代码:
try {
$this->_connection = new PDO(
$dsn,
$config['login'],
$config['password'],
$flags
);
$this->connected = true;
if (!empty($config['settings'])) {
foreach ($config['settings'] as $key => $value) {
$this->_execute("SET $key=$value");
}
}
} catch (PDOException $e) {
throw new MissingConnectionException(array(
'class' => get_class($this),
'message' => $e->getMessage()
));
}
有一个$config〔'settings〕数组可以进行配置。但我不知道如何填充设置数组,也不知道在哪里最好。
我需要的是实时修改默认的数据源配置
您可以向位于app/Config/database.php
的配置数组添加一个额外的密钥,如下所示:
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'db_user',
'password' => 'db_pass',
'database' => 'db_name',
'prefix' => '',
'settings' => array(
'time_zone' => "'+01:00'", // note the quotes!
)
);
相关:CakePHP开关数据库(使用相同的数据源)在运行中?
我用以下方式解决了它。
首先,将setOptions()
方法添加到DATABASE_CONFIG类中,如下所示:
public function setOptions ($datasource, array $options){
$this->{$datasource} = array_merge($this->{$datasource}, $options);
}
然后,扩展ConnectionManager类来初始化它:
class ConnectionManagerCustomConfig extends ConnectionManager
{
public static function initialize(){
self::_init();
}
}
现在我初始化类并添加新选项:
ConnectionManagerCustomConfig::initialize();
$configClass = ConnectionManagerCustomConfig::$config;
$configClass->setOptions('default', array(
'settings' => array(
'time_zone' => $offset
)
));