Hướng dẫn php clear memory after loop - php xóa bộ nhớ sau vòng lặp

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.

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

MSG lỗi từ tệp nhật ký: Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 851443712 byte cạn kiệt (đã cố gắng phân bổ 71 byte)

Không có tập lệnh nào đượ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 thập rác và xóa bộ nhớ? Bất kỳ sự giúp đỡ hoặc hướng dẫn sẽ được đánh giá cao.

Nhập tập lệnh:

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',                    "");
/* 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);

Ngày 22 tháng 2 năm 2015

Nếu bạn đang sử dụng các tệp lớn hơn như các tệp dữ liệu hoặc hình ảnh lớn hơn, bộ nhớ có thể trở thành một vấn đề. Ngay cả khi không, luôn luôn thực hành tốt để sử dụng lượng bộ nhớ tối ưu. Bộ nhớ xóa chỉ là một phần của các kỹ thuật lập trình tốt. Bài đăng/hướng dẫn này sẽ cố gắng trải qua các ví dụ liên quan về bộ nhớ rõ ràng vấn đề. Bạn không thể luôn luôn dựa vào GC (người thu gom rác).

Hết bộ nhớ

Khi bạn là một lập trình viên PHP trong một thời gian, tôi chắc chắn rằng bạn đã gặp phải lỗi nghiêm trọng khi bạn hết bộ nhớ.

Source code viewer

  1. PHP Fatal error: Allowed memory size of ... bytes exhausted (tried to allocate ... bytes) in ... on line ...

Programming Language: Text

Nhưng hãy lưu ý, điều đó có thể có nghĩa là bạn có Vòng lặp vô hạn ở đâu đó.

Sử dụng bộ nhớ hiện tại

memory_get_usage trả về việc sử dụng bộ nhớ hiện tại trong byte. Nếu bạn đang sử dụng một số loại khung, nó có thể có một số chức năng chuyển đổi nó cho bạn thành KB hoặc MB. Một chức năng hữu ích khác là memory_get_peak_usage, theo cách đó bạn có thể phát hiện các đỉnh. Vì vậy, việc sử dụng là để tối ưu hóa và đỉnh là để gỡ lỗi và tìm các điểm yếu.

Source code viewer

  1. echo 'Usage: ' . (memory_get_usage(true) / 1024 / 1024) . ' MB' . PHP_EOL;

Programming Language: PHP

Thu gom rác thải

Sử dụng UndT để hủy đặt một biến hoặc một đối tượng. Người thu gom rác PHP sẽ loại bỏ nó thực sự khi nó phù hợp. Bộ nhớ sẽ không bị buộc phải tự giải phóng để lưu các chu kỳ CPU. Không đặt biến hoặc đối tượng của bạn thành NULL, nếu bạn muốn xóa bộ nhớ biến. Nếu bạn thực hiện việc giải phóng biến theo cách thủ công, bạn có thể buộc giải phóng bộ nhớ bằng gc_collect_cycles kể từ Php 5.3, nhưng nó không cần thiết trong trường hợp bình thường.

Source code viewer

Programming Language: PHP

Từ Php 5.3, bạn có thể sử dụng chức năng GC_COLLECT_CYCLES để buộc người thu gom rác để chạy chu kỳ của nó.

Source code viewer

  1. gc_collect_cycles();

Programming Language: PHP

Nó rất hữu ích để sử dụng các chức năng. Sau khi chức năng kết thúc, dữ liệu sẽ được coi là dư thừa.

Source code viewer

  1. function foo() {}

Programming Language: PHP

Các biến của PHP là toàn cầu. Vì vậy, chúng sẽ có sẵn sau vòng lặp. Nếu bạn muốn xóa bộ nhớ thì bạn có thể sử dụng Unfet hoặc chỉ cần đặt vào một hàm khác thì các biến sẽ được xóa. Bộ nhớ và hiệu suất đi đôi với nhau, vì vậy rất hữu ích khi thực hiện bộ nhớ đệm trong ứng dụng PHP của bạn. Bạn không nên chạy cùng một quy trình nhiều lần nếu có thể. Tương tự áp dụng cho các truy vấn SQL.

Lực lượng bộ nhớ rõ ràng

Khi bạn hết bộ nhớ trong một vòng lặp thì bạn có thể cần phải buộc bộ nhớ rõ ràng ngay lập tức. Sau đó, Unset không phải là cách của bạn để đi. Bạn cần đặt biến của mình thành NULL, theo cách đó bộ nhớ sẽ được giải phóng ngay lập tức.

Source code viewer

  1. // Load a huge xml to memory.

  2. foreach ($response->xpath('//item') as $key => &$item) {

  3. // ...

  4. // Clear item and other variables from memory after each loop, or you will run out of it really fast.

  5. $item = NULL;

  6. }

Programming Language: PHP

PHP không được đặt rõ ràng bộ nhớ?

unset () thực hiện đúng những gì tên của nó nói - không đặt một biến.Nó không buộc giải phóng bộ nhớ ngay lập tức.Người thu gom rác của PHP sẽ làm điều đó khi thấy phù hợp - theo ý định sớm, vì những chu kỳ CPU đó không cần thiết, hoặc muộn như trước khi tập lệnh sẽ hết bộ nhớ, bất cứ điều gì xảy ra trước.It does not force immediate memory freeing. PHP's garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren't needed anyway, or as late as before the script would run out of memory, whatever occurs first.

Điều gì tốt hơn trong việc giải phóng bộ nhớ bằng php unset () hoặc $ var null?

Biến NULL: Nó nhanh chóng giải phóng bộ nhớ.

Bộ sưu tập rác hoạt động như thế nào trong PHP?

Nếu một biến là một phần của tham chiếu theo chu kỳ, ví dụ: trong đó $ A chỉ vào $ B và $ B trở lại $ A, thì biến chỉ có thể được làm sạch bởi bộ thu gom rác của PHP.Bộ thu gom rác được kích hoạt bất cứ khi nào 10.000 đối tượng hoặc mảng có thể có trong bộ nhớ và một trong số chúng rơi ra khỏi phạm vi.The garbage collector is triggered whenever 10,000 possible cyclic objects or arrays are currently in memory, and one of them falls out of scope.