Мой скрипт импортирует файл excel в базу данных продукта для обновления количества новых продуктов и т. Д ….
У меня проблема с памятью, и я попытался увеличить лимит памяти до max (800 МБ +). Я попытался отключить переменные, чтобы освободить память между циклами, но у меня все еще не хватает памяти. Я попытался установить тайм-аут на бесконечность, но это определенно проблема с памятью.
Ошибка msg из файла журнала: Неустранимая ошибка: Допустимый размер памяти 851443712 байт исчерпан (пытался выделить 71 байт)
Ни один из скриптов не содержится в функции. Если я создаю основной цикл внутри функции и многократно вызываю эту функцию, это поможет собрать мусор и очистить память? Любая помощь или руководство будут оценены.
Импорт сценария:
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', "xxxxxx@gmail.com"); /* 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("mdy g:ia")."\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("mdy g:ia")."\tCompleted\n\n"; //print_r($AAnotmapped); //print_r($AApriceupdated); //print_r($AAimgerror);
Используйте функции.
Используйте $var = null;
вместо unset($var);
, Unset просто убивает ссылку на переменные.
Как упоминалось в этом комментарии :
Когда вы используете unset, память будет освобождаться всякий раз, когда сборщик мусора решает, но когда вы устанавливаете переменную на другое значение (в данном случае – null), вы можете освободить некоторую память, конечно, за счет стоимости процессора.
Даже когда вы используете функции, вы ожидаете, что сборщик мусора очистит все в рамках функции, когда функция вернется. Это не гарантия, и использование функций может даже работать против вас, если вы боретесь с использованием памяти. Из-за области php должен создавать копии переменных, передаваемых в качестве параметров, которые будут только дополнять использование памяти. Вы могли бы изучить пропущенные ссылки.
Сборщик мусора будет освобождать память только тогда, когда будут доступны циклы CPU. Обычно в циклах это не даст шанса, поэтому он попытается сделать это после цикла, и в этом случае, возможно, уже слишком поздно.
Однако вы можете заставить сборщика мусора совершить свой раунд, вызвав gc_collect_cycles
.
Также вы можете попробовать отладить свой код с помощью memory_get_usage()