如何在运行长PHP脚本时清除内存?试过了
我的脚本将excel文件导入产品数据库,以更新新产品的数量等 我有内存问题,我已尝试将内存限制提高到最大值(800MB+)。为了释放循环之间的内存,我尝试了取消设置变量,但内存仍然不足。我曾尝试将超时设置为无限,但这肯定是内存问题 日志文件中的错误消息: 致命错误:允许的内存大小851443712字节已用尽(尝试分配71字节) 函数中不包含任何脚本。如果我在一个函数中创建main for循环并反复调用该函数,这会有助于垃圾收集和清除内存吗?任何帮助或指导都将不胜感激 导入脚本:如何在运行长PHP脚本时清除内存?试过了,php,mysql,Php,Mysql,我的脚本将excel文件导入产品数据库,以更新新产品的数量等 我有内存问题,我已尝试将内存限制提高到最大值(800MB+)。为了释放循环之间的内存,我尝试了取消设置变量,但内存仍然不足。我曾尝试将超时设置为无限,但这肯定是内存问题 日志文件中的错误消息: 致命错误:允许的内存大小851443712字节已用尽(尝试分配71字节) 函数中不包含任何脚本。如果我在一个函数中创建main for循环并反复调用该函数,这会有助于垃圾收集和清除内存吗?任何帮助或指导都将不胜感激 导入脚本: error_re
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("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);
error\u reporting(E\u ALL&~E\u NOTICE);
ini_集合(“内存限制”,“812M”);
设置时间限制(0);
/*配置启动*/
定义('BasePath','/home/xxxxx/public_html');
定义('CfgMagentoPath',BasePath);
定义('CfgCategoryMapDBxls',BasePath./xxxx/Shdddddd.xls”);
定义('CfgVenderDBxls',BasePath./xxxx/xxxxxx.xls”);
定义('CfgReportEmail',“xxxxxx@gmail.com");
/*配置端*/
需要一次(CfgMagentoPath./app/Mage.php');
Mage::app();
//$app=Mage::app('default');
//Mage::app()->setCurrentStore(Mage_Core_Model_app::ADMIN_STORE_ID);
需要一次(BasePath./xxxxx/xxxx/libs/mage.func-inc.php');
需要_一次(BasePath./xxxxx/xxxxx/libs/excel read.class.php);
//警报阵列
$AAnotmapped=array();
$AAnewproducts=array();
$AApriceupdated=array();
$AAimgerror=array();
$PriceErrors=array();
$SkipCat=false;
//创建映射猫-在Magento中
$excel=新的ExcelReader(CfgCategoryMapDBxls,“UTF-8”);
$CM=$excel->getWorksheetData('Sheet1');
如果(!$SkipCat){
echo“=============生成分类映射====================\n\n”;
CatMap_创建($CM);
回音“==============================================================================================================================\n\n”;
}
//开始项读取
$excel=新的ExcelReader(CfgVenderDBxls,“UTF-8”);
$IT=$excel->getWorksheetData('New_DATA');
$ITcnt=0;
$ITtotal=计数($IT);
foreach($ItemRow){
$ITcnt++;
$cSKU=$ItemRow['ITEM'];
$cProductName=Clean_数据($ItemRow['ALTSHORTDESC']);
$cCatName=Clean_数据($ItemRow['CATEGORY']);
$cManuf=清洁数据($ItemRow['MANUFACTURER']);
$cShortDesc=清除数据($ItemRow['SHORTDESC']);
$cLongDesc=Clean_数据($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'];
//定位分类映射Magento ID
$mCatId=CatMap_Search($CM,$ItemRow['CATEGORY']);
//现在创建产品
如果($mCatId>0&&$cProductName!=“”){
回音日期(“m.d.y g:i a”)。\t($ITcnt/$ITtotal)处理:“$cProductName.”-SKU:$cSKU\n”;
$ProdID=Prod_GetIDfromSKU($cSKU);
如果($ProdID>0){
if(产品更新($ProdID、$cCost、$cStockQty、$cWeight、$cUPC)){
echo“已更新:$cProductName\n”;
$ITindex++;
}
}否则{
产品创建($cSKU、$cProductName、$cManuf、$cPrice、$cCost、$Cwweight、$cShortDesc、$cLongDesc、$cStockQty、$cUPC、$mCatId);
echo“已创建:$cProductName到类别:$mCatId\n”;
回显“$cShortDesc\n\n”;
$ProdID=Prod_GetIDfromSKU($cSKU);
}
如果($cPrice使用函数。
使用$var=null;
而不是unset($var);
。unset只会终止变量引用
如本节所述:
当您使用unset时,仅当垃圾收集器决定释放内存时,才会释放内存,但当您将变量设置为不同的值(在本例中为null)时,您可能会释放一些内存,当然这需要CPU成本
即使在使用函数时,当函数返回时,您也会期望垃圾收集器清理函数范围内的所有内容。这不是保证,如果您正在与内存使用作斗争,使用函数甚至可能会对您不利。由于范围的原因,php必须创建作为参数传递的变量的副本,这将导致我只计算内存使用量。您可以查看传递引用的情况
垃圾收集器只有在CPU周期可用时才会释放内存。通常在循环中,它不会有机会释放内存,因此它会在循环结束后尝试释放内存,在这种情况下,可能已经太晚了
但是,您可以通过调用gc\u collect\u cycles
来强制垃圾收集器执行这一轮操作
此外,您还可以尝试使用内存\u get\u usage()
@Michael调试代码,这就是为什么它被称为unset,而不是kill\u with\u extrement\u prediction()
:)关键是,在垃圾收集发生之前,内存不会被“unset”清除。这取决于为“muni”缴税。抱歉,伙计们。晚上工作。不再是非顶级的。当您使用unset时,只有在垃圾收集器决定时,内存才会被释放,但当您将变量设置为其他值时(本例中为空),然后您可能会以CPU的成本释放一些内存。+1经过长时间的测试后,使用null
比unset
提供更好的结果。尽管如此,问题仍然存在,每分钟数百个对象的小块仍然会使脚本崩溃。在重新分配变量之前先取消变量不会带来任何好处什么版本的PHP?这些函数里面有什么?你的excel阅读器拉数据是急切的还是懒惰的?