My script imports an excel file into a product database to update quantities new products etc....
I am having memory issue and I have tried raising the memory limit to the max(800MB+). I have tried unsetting the variables in order to release the memory between the loops but I still run out of memory. I have tried setting the timeout to infinite but its definitely a memory issue.
Error msg from log file: Fatal error: Allowed memory size of 851443712 bytes exhausted (tried to allocate 71 bytes)
None of the script is contained in a function. If I create the main for loop inside a function and repeatedly call that function will that help garbage collection and clear up memory? Any help or guidance will be appreciated.
Import Script:
error_reporting( E_ALL & ~E_NOTICE ); ini_set('memory_limit', '812M'); set_time_limit(0); /* Config Start */ define('BasePath', '/home/xxxxx/public_html'); define('CfgMagentoPath', BasePath); define('CfgCategoryMapDBxls', BasePath."/xxxx/Shdddddd.xls"); define('CfgVenderDBxls', BasePath."/xxxx/xxxxxx.xls"); define('CfgReportEmail', "[email protected]"); /* Config End */ require_once(CfgMagentoPath . '/app/Mage.php'); Mage::app(); //$app = Mage::app('default'); //Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); require_once(BasePath.'/xxxxx/xxxx/libs/mage.func-inc.php'); require_once(BasePath.'/xxxxx/xxxxx/libs/excel-read.class.php'); //Alert Arrays $AAnotmapped = array(); $AAnewproducts = array(); $AApriceupdated = array(); $AAimgerror = array(); $PriceErrors = array(); $SkipCat = false; //Create Mapped Cats - In Magento $excel = new ExcelReader(CfgCategoryMapDBxls,"UTF-8"); $CM = $excel->getWorksheetData('Sheet1'); if(!$SkipCat){ echo "======== Generating Catagory Maps ===========\n\n"; CatMap_Create($CM); echo "======== ============================== ===========\n\n"; } //Start Item Read $excel = new ExcelReader(CfgVenderDBxls,"UTF-8"); $IT = $excel->getWorksheetData('New_DATA'); $ITcnt = 0; $ITtotal = count($IT); foreach($IT as $ItemRow){ $ITcnt++; $cSKU = $ItemRow['ITEM']; $cProductName = Clean_Data($ItemRow['ALTSHORTDESC']); $cCatName = Clean_Data($ItemRow['CATEGORY']); $cManuf = Clean_Data($ItemRow['MANUFACTURER']); $cShortDesc = Clean_Data($ItemRow['SHORTDESC']); $cLongDesc = Clean_Data($ItemRow['LONGDESC']); $cUPC = Prod_GetUPC($ItemRow['UPC'], $ItemRow['ALTUPC']); $cStockQty = $ItemRow['QTY']; $cWeight = Prod_GetWeight($ItemRow['WEIGHT'], $ItemRow['ALTWEIGHT']); $cPrice = Prod_FigurePrice($ItemRow['COST'], $ItemRow['MSRP'], $ItemRow['MAP']); $cCost = $ItemRow['COST']; //Locate Catagory Map Magento ID $mCatId = CatMap_Search($CM, $ItemRow['CATEGORY']); //Now Create Product if($mCatId > 0 && $cProductName != ""){ echo date("m.d.y g:i a")."\t($ITcnt / $ITtotal) Working On: " . $cProductName . " - SKU: $cSKU\n"; $ProdID = Prod_GetIDfromSKU($cSKU); if($ProdID > 0){ if(Prod_Update($ProdID, $cCost, $cStockQty, $cWeight, $cUPC)){ echo "Updated: $cProductName\n"; $ITindex++; } }else{ Prod_Create($cSKU, $cProductName, $cManuf, $cPrice, $cCost, $cWeight, $cShortDesc, $cLongDesc, $cStockQty, $cUPC, $mCatId); echo "Created: $cProductName to Catagory: $mCatId\n"; echo "$cShortDesc\n\n"; $ProdID = Prod_GetIDfromSKU($cSKU); } if($cPrice <= $cCost){ array_push($PriceErrors, "[$cSKU] $cProductName > Cost: $cCost | Price: $cPrice"); echo "Price Lower than Cost : Auto Inactive : Cost: $cCost | Price: $cPrice\n"; } Prod_AddImg($ProdID, $cSKU); } unset($ItemRow, $ProdID, $cSKU, $cProductName, $cManuf, $cPrice, $cCost, $cWeight, $cShortDesc, $cLongDesc, $cStockQty, $cUPC, $mCatId); echo "\n"; } echo "======== Disabling 0 Product Catagories ===========\n\n"; Cat_Disable_Empty($CM); echo "======== ============================== ===========\n\n"; unset($CM, $IT, $excel); //array_push($AAnotmapped, 'Cat not Mapped'); //array_push($AApriceupdated, '### Price Updated'); //array_push($AAimgerror , 'Image Error'); Send_Status_Email(); Mage_Reindex(); echo date("m.d.y g:i a")."\tCompleted\n\n"; //print_r($AAnotmapped); //print_r($AApriceupdated); //print_r($AAimgerror);
Use functions.
Use $var = null;
instead of unset($var);
. Unset simply kills the variable reference.
As mentioned on this comment:
When you are using unset, the memory will only be freed whenever garbage collector decides, but when you are setting a variable to a different value (null in this case), then you might get some memory freed of course with the cost of CPU.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With