2010-10-09 19 views
16

Tôi muốn viết một vỏ bánh để làm một bản sao lưu hàng đêm của cơ sở dữ liệu của tôi bằng cách sử dụng mysqldump. Tôi có thể làm điều này như là một kịch bản shell, nhưng nếu tôi có thể nhồi nhét nó vào một khung CakePHP, thì tôi sẽ nhận được lợi ích bổ sung của nó làm việc trên cả máy chủ phát triển và live, nếu tôi có thể đọc nó để tự động đọc các thiết lập cấu hình cơ sở dữ liệu của mình . Tôi sẽ cron vỏ bánh và có một số hòa bình-of-mind biết rằng tôi đã sao lưu thường xuyên của DB của tôi.Làm thế nào tôi có thể đọc các thiết lập cấu hình DB từ một vỏ bánh?

Trong trình bao, tôi đang cố xây dựng một chuỗi bắt đầu bằng "mysqldump --user =" và tôi muốn lấy tên người dùng từ app/config/database.php. Làm thế nào tôi có thể lấy dữ liệu trong database.php?

Trả lời

2

TrongCakePHP 3.x định dạng đã thay đổi thành -

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

debug($source); #Debugging the result 

Kết quả:

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 
} 

Lấy kết quả:

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

Kết quả:

[ 
    '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

Xem vỏ [CurrentConfig] (https://github.com/dereuromark/cakephp-setup/blob/master/src/Shell/CurrentConfigShell.php). – mark

9

Đoạn sau đây sẽ làm các trick:

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

hoạt động như một sự quyến rũ. cảm ơn! – the0ther

29

Trong bánh 2.1 định dạng đã thay đổi thành:

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

cảm ơn bạn đã cập nhật. Tôi đã chơi với phiên bản mới của bánh mới đây, có vẻ là một vài thay đổi. – the0ther

1

Chỉ cần để chia sẻ.

Đối với bất kỳ dự án CakePHP nào, nếu sử dụng php làm cronjob hoặc dòng lệnh để xử lý dữ liệu lớn, tôi sẽ xây dựng một tập lệnh php độc lập không có cakephp, lý do thực hiện điều này vì cakephp chậm (ví dụ: đọc & quá trình ghi 100K).

Để làm cho cuộc sống của tôi đơn giản tôi đặt tất cả các kịch bản độc lập của tôi dưới app/Vendor/myscripts/(ví dụ: app/Vendor/myscripts/process.php)

dưới đây cũng là mã cơ bản để đảm bảo bạn sử dụng thiết lập cơ sở dữ liệu tương tự trong kịch bản độc lập với CakePHP (thử nghiệm với 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

Ví dụ trong điều khiển, thay đổi đa DB cho DataSource trong 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'); 
} 
Các vấn đề liên quan