Как я могу прочитать настройки конфигурации БД из оболочки торта?
Я хотел бы написать оболочку торта, чтобы сделать ночную резервную копию моей базы данных с помощью mysqldump. Я мог бы сделать это как оболочку script, но если я смогу втиснуть ее в оболочку CakePHP, я получу дополнительную выгоду от нее, работая как на сервере разработки, так и на живом сервере, если я могу получить его для автоматического чтения моей базы данных конфигурации. Я закрою оболочку торта и немного успокоюсь, зная, что у меня частые резервные копии моей БД.
В моей оболочке я пытаюсь создать строку, которая начинается с "mysqldump --user =", и я хотел бы получить имя пользователя из app/config/database.php. Как я могу получить данные в database.php?
Ответы
Ответ 1
В CakePHP 3.x
формат изменился на -
use Cake\Datasource\ConnectionManager;
$source = ConnectionManager::get('default');
debug($source); #Debugging the result
Результат:
object(Cake\Database\Connection) {
'config' => [
'password' => '*****',
'username' => '*****',
'host' => '*****',
'database' => '*****',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
'url' => null,
'name' => 'remote'
],
'driver' => object(Cake\Database\Driver\Mysql) {
'connected' => false
},
'transactionLevel' => (int) 0,
'transactionStarted' => false,
'useSavePoints' => false,
'logQueries' => false,
'logger' => null
}
Получить результат:
debug($source->config()); #Accessing the result
Результат:
[
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'username',
'password' => 'password',
'database' => 'database',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
'url' => null,
'name' => 'remote'
]
Ответ 2
В торте 2.1 формат изменился на:
App::uses('ConnectionManager', 'Model');
$dataSource = ConnectionManager::getDataSource('default');
$username = $dataSource->config['login'];
Ответ 3
Следующий фрагмент должен сделать трюк:
App::import('Core', 'ConnectionManager');
$dataSource = ConnectionManager::getDataSource('default');
$username = $dataSource->config['login'];
Ответ 4
Просто для обмена.
Для любого проекта cakephp, если вы используете php как cronjob или командную строку для выполнения большой обработки данных, я бы построил автономный php script без cakephp, причина для этого, потому что cakephp медленный (например, чтение и обработка 100K записей).
Чтобы сделать мою жизнь простой, я поместил все свои автономные скрипты в приложение/Vendor/myscripts/(например: app/Vendor/myscripts/process.php)
ниже также базовый код, чтобы убедиться, что вы используете одни и те же настройки базы данных в автономном script с помощью cakephp (проверено с MySQL)
require_once '/XYZ/app/Config/database.php';
$database = new DATABASE_CONFIG;
try{
$dblink = new PDO('mysql:host='.$database->default['host'].';dbname='.$database->default['database'], $database->default['login'], $database->default['password'], array(PDO::ATTR_PERSISTENT => false));
$dblink->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dblink->exec('SET CHARACTER SET '.$database->default['encoding']);
} catch (Exception $e) {
die('DB Error'. $e->getMessage());
}
Ответ 5
Пример в контроллере, смените несколько DB для DataSources в CakePHP 2.5.x
App::uses('AppController', 'Controller');
class DemoController extends AppController {
public $uses = array('AppModel', 'GVA21', 'GVA01', 'GVA14', 'GVA24' );
public function test_dbs(){
$this->autoRender=false;
// Load ConnectManager
App::uses('ConnectionManager', 'Model');
// DataSource ['default']
$MDM = $this->GVA14->find('count');
echo "MDM.GVA14\n<br>";
debug($MDM);
// Get DataSource Config DB ['default'] and ['SRL']
$confDeafult = ConnectionManager::$config->default;
$confSrl = ConnectionManager::$config->SRL;
// Change DataSource ['SRL']
ConnectionManager::drop('default');
ConnectionManager::create('default',$confSrl); //<== Is permanet change Find All models Down
// $this->GVA01->setDataSource('SRL'); //<== Is temp change Find model
echo "SRL.GVA14\n<br>";
$SRL = $this->GVA14->find('count');
debug($SRL);
$SRL = $this->GVA01->find('count');
echo "SRL.GVA01\n<br>";
debug($SRL);
$SRL = $this->GVA21->find('count');
echo "SRL.GVA21\n<br>";
debug($SRL);
// Change to DataSource ['default']
debug(ConnectionManager::drop('default'));
ConnectionManager::create('default',$confDeafult); //<== Is permanet change Find All models Down
//$this->GVA01->setDataSource('default'); //<== Is temp change Find model
$MDM = $this->GVA01->find('count');
echo "MDM.GVA01\n<br>";
debug($MDM);
$MDM = $this->GVA21->find('count');
echo "MDM.GVA21\n<br>";
debug($MDM);
////FIN
exit('FIN');
}