Dieses Probleme umgehe ich dadurch, dass ich das Backup nicht mit einem Controller sondern einer cakeShell erledige.
Diese Shell kann dann einfach durch zb. einen Cronjob aufgerufen werden.
Hier die Shell die alle Informationen zu den Tabellen ausliest.
Folgende Datei in /app/vendors/shells/db_dump.php erzeugen:
- Code: Alles auswählen
<?php
class DbDumpShell extends Shell {
var $tasks = array('WriteSql');
/*
* Main der Shell
* ruft nacheinander die Methoden zum Erzeugen der Tabellen und deren Inhalte auf
*
*/
function main() {
App::import('Core', 'Configure');
$this->Configure = new Configure();
$models = $this->Configure->listObjects('model');
foreach ($models as $model) {
App::import('Model', $model);
$this->$model = new $model();
}
$tables = array();
$tables = $this->getTables($models);
$tablesTmp = $this->getFields($models);
foreach ($tables as $key => $value) {
$tables[$key]['contents'] = $tablesTmp[$key]['contents'];
}
$this->WriteSql->execute($tables); //Aufruf des Tasks
}
/*
* Liefert die sql-Statements zum Erstellen der Tabellen
*
* @param array $models: Array aller Models
* @return array $tables: sql-Statement zum Erstellen der Tabellen
*/
function getTables($models) {
App::import('Core', 'Inflector');
$tables = array();
foreach ($models as $model) {
$tableName = Inflector::tableize($model);
if ($this->$model->useTable != '') {
$sql = 'describe ' . $tableName;
$columns = $this->$model->query($sql);
$tables[$model]['table'] = 'create table ' . $tableName . '(';
$i = 0;
foreach ($columns as $column) {
$key = ($column['COLUMNS']['Key'] == 'PRI') ? 'primary key' : '';
if ($i == count($columns) - 1) {
$tables[$model]['table'] .= '`' . $column['COLUMNS']['Field'] . '` ' . $column['COLUMNS']['Type'] . ' ' . $column['COLUMNS']['Extra'] . ' ' . $key;
} else {
$tables[$model]['table'] .= '`' . $column['COLUMNS']['Field'] . '` ' . $column['COLUMNS']['Type'] . ' ' . $column['COLUMNS']['Extra'] . ' ' . $key . ', ';
}
$i++;
}
$tables[$model]['table'] .= ') character set utf8 collate utf8_unicode_ci;';
}
}
return $tables;
}
/*
* Liefert die Inhalte aller Tabellen
*
* @param array $models: Array aller Tabellen
* @return array $tables: Array mit den Inhalten der jeweiligen Tabelle
*/
function getFields($models) {
App::import('Core', 'Inflector');
$tables = array();
foreach ($models as $model) {
$tableName = Inflector::tableize($model);
if ($this->$model->useTable != '') {
$contents = $this->$model->find('all');
$i = 0;
foreach ($contents as $content) {
$tables[$model]['contents'][$i] = 'INSERT INTO `' . $tableName . '` VALUES (';
$y = 0;
foreach ($content[$model] as $field) {
if ($y == 0) {
$tables[$model]['contents'][$i] .= '"' . $field . '"';
} else {
$tables[$model]['contents'][$i] .= ', "' . $field . '"';
}
$y++;
}
$tables[$model]['contents'][$i] .= ');';
$i++;
}
}
}
return $tables;
}
}
?>
Und dieser Task übernimmt das Speichern der Daten.
Datei /app/vendors/shells/tasks/write_sql.php mit folgendem Inhalt erzeugen:
- Code: Alles auswählen
<?php
class WriteSqlTask extends Shell {
function execute($tables) {
$today = getdate();
App::import('Core', 'File');
$file = new File(APP . DS . 'webroot' . DS . 'backups' . DS . 'dump_' . $today['mday'] . $today['month'] . $today['year'] . '.sql', true);
App::import('Core', 'Inflector');
foreach ($tables as $key => $value) {
$tableName = Inflector::tableize($key);
$file->write('#' . "\n" . '# Table ' . $tableName . "\n" . '#' . "\n");
$file->write($value['table'] . "\n\n");
foreach ($value['contents'] as $content) {
$file->write($content . "\n");
}
$file->write("\n\n\n\n");
}
$file->close();
}
}
?>
Jetzt einfach in die cake Console wechseln.
Und dort eingeben: cake db_dump
Unter /app/webroot/backups werden nun die Backups abgelegt.

