2012-05-11 30 views
13

Tập lệnh của tôi nhập tệp excel vào cơ sở dữ liệu sản phẩm để cập nhật số lượng sản phẩm mới, v.v.Làm cách nào để xóa bộ nhớ trong khi chạy tập lệnh PHP dài? try unset()

Tôi đang gặp vấn đề về bộ nhớ và đã thử tăng giới hạn bộ nhớ lên tối đa (800MB +). Tôi đã thử unsetting các biến để phát hành bộ nhớ giữa các vòng nhưng tôi vẫn chạy ra khỏi bộ nhớ. Tôi đã cố gắng thiết lập thời gian chờ để vô hạn nhưng nó chắc chắn là một vấn đề bộ nhớ.

Lỗi msg từ log file: Fatal error: Được phép kích thước bộ nhớ của 851.443.712 byte kiệt sức (cố gắng phân bổ 71 byte)

Không ai trong số các kịch bản được chứa trong một hàm. Nếu tôi tạo chính cho vòng lặp bên trong một hàm và liên tục gọi hàm đó sẽ giúp thu gom rác và xóa bộ nhớ? Bất kỳ trợ giúp hoặc hướng dẫn nào sẽ được đánh giá cao.

nhập 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); 
+0

Bỏ đặt các biến ngay trước khi bạn chỉ định lại các biến mà bạn không có gì ở đây. Phiên bản PHP nào? Có gì bên trong một số chức năng này? Trình đọc excel của bạn có thu thập dữ liệu háo hức hay lười biếng không? Liệu nó hết bộ nhớ trước khi đến mage_reindex? –

+0

Xin chào Cory, phiên bản PHP là 5.2.9, kịch bản được thông qua khoảng ~ 3700-4000 sản phẩm trước khi nó chết. Tôi không chắc chắn nếu nó là lười biếng/háo hức và có nó chạy ra khỏi bộ nhớ trước khi gọi mage_reindex. –

Trả lời

17

Sử dụng chức năng này.
Sử dụng $var = null; thay vì unset($var);. Bỏ đặt chỉ đơn giản là giết tham chiếu biến.


Như đã đề cập về vấn đề này 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.

+1

Có gì sai khi "giết tham chiếu biến"? – deceze

+8

@ lừa dối Giết chết là sai, người đàn ông ... –

+5

@Michael Đó là lý do tại sao nó được gọi là độc đáo * bỏ đặt *, không phải 'kill_with_extreme_prejudice()'. :) – deceze

2

Ngay cả khi bạn sử dụng chức năng này, bạn mong chờ thu gom rác để làm sạch tất cả mọi thứ trong phạm vi của hàm khi hàm trả về .. Đây không phải là một đảm bảo và sử dụng các chức năng thậm chí có thể làm việc chống lại bạn nếu bạn đang chiến đấu sử dụng bộ nhớ. Vì phạm vi, php phải tạo các bản sao của các biến được truyền dưới dạng tham số, mà sẽ chỉ thêm vào mức sử dụng bộ nhớ. Bạn có thể xem xét tham chiếu đi qua.

Bộ thu gom rác sẽ chỉ giải phóng bộ nhớ khi có chu kỳ CPU. Thông thường trong vòng nó sẽ không có cơ hội, vì vậy nó sẽ cố gắng làm điều này sau vòng lặp, trong trường hợp đó có thể đã quá muộn.

Tuy nhiên, bạn có thể buộc trình thu gom rác thực hiện vòng của mình bằng cách gọi gc_collect_cycles.

Ngoài ra, bạn có thể thử gỡ lỗi mã của mình bằng cách sử dụng memory_get_usage()

+0

Việc chuyển qua tham chiếu là một ý tưởng tốt cho các tham số dữ liệu lớn mà bạn có thể chuyển. Chỉ cần cẩn thận không chỉnh sửa thông số đó trong hàm nếu bạn không có ý định. Ngoài ra, gỡ lỗi luôn là .... một ý tưởng hay. – arikin

Các vấn đề liên quan