}
public function backup(){
$app =& JFactory::getApplication();
$createTablesSQL = $this->_dbo->getTableCreate($this->_tables);
$databaseName = $app->getCfg("db");
$data = "--\n-- Database: `{$databaseName}`\n--\n\n";
foreach ($createTablesSQL as $key => $value){
$data .= "DROP TABLE IF EXISTS `{$key}`;\n";
$data .= "\n--\n-- Table structure for table `{$key}`\n--\n";
$data .= $value . ";\n";
$tableFields = $this->_dbo->getTableFields($key);
$this->_dbo->setQuery("SELECT * FROM `{$key}`");
$this->_dbo->query();
if($this->_dbo->getNumRows()){
$data .= "--\n-- Dumping data for table `{$key}`\n--\n";
$data .= "LOCK TABLES `{$key}` WRITE;\n";
$fields = array_keys($tableFields);
$data .= "REPLACE INTO `{$key}` (`".implode("`, `", array_keys($tableFields[$fields[0]]))."`) VALUES \n";
// Load data from table
$rows = $this->_dbo->loadRowList();
$_ = array();
foreach ($rows as $row){
foreach ($row as $k => $v){
if(!isset($v))
$row[$k] = 'NULL';
else
$row[$k] = "'".addslashes($v)."'";
}
$_[] = "\t(".implode(", ", $row).")";
}
$data .= implode(",\n", $_);
$data .= ";\nUNLOCK TABLES;\n\n";
}
}
// fix dbprefix after getTableCreate
$tablePrefix = $app->getCfg("dbprefix");
$data = str_replace($tablePrefix, "#__", $data);
// write backup file
$path2Filename = $this->path2BackupFiles;
$filename = $this->filePrefix . date("Y_m_d_H_i_s", time()) . "_" . CompanyUpdate::getCurrentVersion() . ".sql";
if(JFile::write($path2Filename . $filename, $data)){
// compression
if(false != ($arFile = $this->compressFile($path2Filename, $filename, 'zip', true))){
return $arFile;
}else{
return false;
}
}else{
return false;
}
}
/**
*
* @param string $path2Filename
* @param string $filename
* @param string $type
* @param bool $cleanUp
* @return bool
*/
private function compressFile($path2Filename, $filename, $type = 'zip', $cleanUp = false){
$fullPathFilename = $path2Filename . $filename;
$adapter =& JArchive::getAdapter($type); // type compression
$files2ZIP = array();
$files2ZIP[0]["name"] = $filename;
$files2ZIP[0]["data"] = JFile::read($fullPathFilename);
if($adapter->create($fullPathFilename . "." . $type, $files2ZIP, $type, $path2Filename)){
if($cleanUp)
JFile::delete($fullPathFilename);
return JFile::stripExt($filename) . "." . $type;
}else{
return false;
}
}
} ?>
有人在某处看到泄漏吗?
编辑:应该考虑发布错误。遗憾致命错误:第395行/home/user2/public_html/administrator/components/com_company/lib/CompanyBaseDManagement.php内存不足(已分配65536000)(尝试分配125459字节)
根据Dreamweaver,这是第395行:$ row [$ k] =“'”。adddslashes($ v)。“'”;
答案 0 :(得分:3)
整个脚本非常低效。它应该将数据以块的形式附加到备份文件中,而不是将整个该死的数据库读入内存,然后在其上运行str_replace(),然后将其发送到压缩函数,该函数将文件重新读入内存,压缩它。 !!!
老实说,我能看到修复这个问题的唯一简单方法是提高php.ini文件中的内存限制,尝试128MB。如果你的数据库不断增长,那么这个数字将不断上升。如果您有权访问,那么废弃该脚本并在命令行上使用mysqldump + gzip会更有效。
答案 1 :(得分:0)
我知道有一个事实,即编辑一个由foreach
循环操作的数组(就像代码中的foreach
循环一样)是非常危险的。我很惊讶它没有抛出一个错误(我想到了一些rea--等到没关系,错误的语言会引发关于编辑foreach循环数组的错误)。我认为那里可能存在无限循环。我已经看到过foreach循环将一个新对象推送到它引用的数组上的实例,最终导致一个无限循环(因为它永远不会耗尽元素来迭代)!
一个好的起点是将被引用的数组和一个新数组与新值分开,然后在 foreach循环后合并它们或其他任何。
答案 2 :(得分:0)
你确定这是泄漏吗?不只是超出内存限制的备份? 我看不出明显的问题是什么,但你是否考虑过对该循环进行一些内存消耗和循环迭代次数的调试?它可能是一个不确定的数据行,在消费突然跳跃时非常明显