[英]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循環之后合並。
您確定是泄漏嗎? 不僅僅是備份超出了內存限制? 我看不到明顯的問題是什么,但是您是否考慮過對該循環的內存消耗和循環迭代次數進行調試? 可能是一排雜亂的數據,在消耗突然增加的情況下應該非常明顯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.