Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I clear the memory while running a long PHP script? tried unset()

Tags:

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); 
like image 553
Bob Jones Avatar asked May 11 '12 02:05

Bob Jones


1 Answers

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.

like image 159
Hameed Avatar answered Sep 29 '22 11:09

Hameed