主要内存泄漏Joomla / PHP ..什么给出?

时间:2011-01-13 19:38:19

标签: php memory-leaks joomla

 }
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)。“'”;

3 个答案:

答案 0 :(得分:3)

整个脚本非常低效。它应该将数据以块的形式附加到备份文件中,而不是将整个该死的数据库读入内存,然后在其上运行str_replace(),然后将其发送到压缩函数,该函数将文件重新读入内存,压缩它。 !!!

老实说,我能看到修复这个问题的唯一简单方法是提高php.ini文件中的内存限制,尝试128MB。如果你的数据库不断增长,那么这个数字将不断上升。如果您有权访问,那么废弃该脚本并在命令行上使用mysqldump + gzip会更有效。

答案 1 :(得分:0)

我知道有一个事实,即编辑一个由foreach循环操作的数组(就像代码中的foreach循环一样)是非常危险的。我很惊讶它没有抛出一个错误(我想到了一些rea--等到没关系,错误的语言会引发关于编辑foreach循环数组的错误)。我认为那里可能存在无限循环。我已经看到过foreach循环将一个新对象推送到它引用的数组上的实例,最终导致一个无限循环(因为它永远不会耗尽元素来迭代)!

一个好的起点是将被引用的数组和一个新数组与新值分开,然后在 foreach循环后合并它们或其他任何

答案 2 :(得分:0)

你确定这是泄漏吗?不只是超出内存限制的备份? 我看不出明显的问题是什么,但你是否考虑过对该循环进行一些内存消耗和循环迭代次数的调试?它可能是一个不确定的数据行,在消费突然跳跃时非常明显

http://uk.php.net/manual/en/function.memory-get-usage.php