2010-10-09 11 views
16

Me gustaría escribir un bizcocho para hacer una copia de seguridad nocturna de mi base de datos usando mysqldump. Podría hacer esto como un script de shell, pero si puedo incluirlo en un shell de CakePHP, obtendré la ventaja adicional de que funciona tanto en el servidor de desarrollo como en el servidor en vivo, si logro leer automágicamente la configuración de configuración de mi base de datos. . Voy a programar el bizcocho y me tranquilizaré sabiendo que tengo copias de seguridad frecuentes de mi base de datos.¿Cómo puedo leer la configuración de configuración de la base de datos desde un shell de Cake?

En mi caparazón estoy tratando de construir una cadena que comience con "mysqldump --user =" y me gustaría obtener el nombre de usuario de la aplicación/config/database.php. ¿Cómo puedo obtener los datos en database.php?

Respuesta

2

EnCakePHP 3.x el formato ha cambiado a -

use Cake\Datasource\ConnectionManager; 
$source = ConnectionManager::get('default'); 

debug($source); #Debugging the result 

Resultado:

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 
} 

obtener el resultado:

debug($source->config()); #Accessing the result 

Resultado:

[ 
    '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' 
] 
+1

Ver el shell [CurrentConfig] (https://github.com/dereuromark/cakephp-setup/blob/master/src/Shell/CurrentConfigShell.php). – mark

9

El siguiente fragmento debe hacer el truco:

App::import('Core', 'ConnectionManager'); 
$dataSource = ConnectionManager::getDataSource('default'); 
$username = $dataSource->config['login']; 
+0

funciona como un encanto. ¡Gracias! – the0ther

29

En torta 2.1, el formato ha cambiado a:

App::uses('ConnectionManager', 'Model'); 
$dataSource = ConnectionManager::getDataSource('default'); 
$username = $dataSource->config['login']; 
+0

gracias por la actualización. He estado jugando con la nueva versión de la torta recientemente, parece haber bastantes cambios. – the0ther

1

Sólo para compartir.

Para cualquier proyecto CakePHP, si se usa PHP como tarea programada o de línea de comandos para hacer grande de procesamiento de datos que construiría un script php independiente sin cakephp, la razón para hacer esto porque cakephp es lenta (por ejemplo, leer & registros proceso de 100K).

Para hacer mi vida simple que poner todos mis procesos independientes bajo APP/Vendedor/myscripts/(por ejemplo: app/Vendedor/myscripts/process.php)

a continuación también el código básico para asegurarse de que se utiliza el mismas configuraciones de bases de datos en escritura independiente con cakephp (probado con 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()); 
} 
-1

Ejemplo en el controlador, Cambiar múltiples DB para DataSources en 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'); 
} 
Cuestiones relacionadas