簡體   English   中英

Joomla / PHP中的主要內存泄漏..有什么用?

[英]Major memory Leak in Joomla/ PHP .. What gives?

 }
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] =“'” .addslashes($ v)。“'”;

整個腳本的內存效率非常低。 它應該將數據分塊追加到備份文件中,而不是將整個該死的數據庫讀取到內存中,然后在其上運行str_replace(),然后將其發送到壓縮函數,該壓縮函數將文件重新讀取到內存中,然后壓縮它。 !!!

老實說,我能看到得到解決的唯一簡單方法是提高php.ini文件中的內存限制,嘗試128MB。 如果您的數據庫持續增長,那么這個數字將繼續增加。 如果可以訪問,最好是刪除該腳本並在命令行上使用mysqldump + gzip。

好吧,我知道一個事實,那就是編輯一個由foreach循環作用的數組(例如代碼中的foreach循環如何)是非常危險的。 我很驚訝它沒有引發錯誤(我想了一下-別介意,錯誤的語言引發有關編輯foreach循環數組的錯誤)。 我認為那里可能存在無限循環。 我曾見過一個實例,其中一個foreach循環會將一個新對象推送到它所引用的數組上,最終導致一個無限循環(因為它永遠不會用完要迭代的元素)!

一個很好的開始是將被引用的數組和帶有新值的新數組分開,然后將它們合並或 foreach循環之后合並。

您確定是泄漏嗎? 不僅僅是備份超出了內存限制? 我看不到明顯的問題是什么,但是您是否考慮過對該循環的內存消耗和循環迭代次數進行調試? 可能是一排雜亂的數據,在消耗突然增加的情況下應該非常明顯

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM