1.9.2.0 এ ভেরিয়েন_আজম_আডাপ্টার_জিডি 2 এর নতুন ডেস্ট্রাক্টরের সাথে ইমপোর্ট এক্সপোর্ট সমস্যা


23

কেউ কি ব্যাখ্যা করতে পারেন, মেগেন্তো সিই 1.9.1.0 এবং 1.9.2.0 এর মধ্যে নিম্নলিখিত কোডটি কী ব্যবহার করা হয়েছিল?

class Varien_Image_Adapter_Gd2:

public function __construct()
{
    // Initialize shutdown function
    register_shutdown_function(array($this, 'destruct'));
}

/**
 * Destroy object image on shutdown
 */
public function destruct()
{
    @imagedestroy($this->_imageHandler);
}

এই দুটি ফাংশন যুক্ত হওয়ার পরে, আমদানি এক্সপোর্ট ইন্টারফেস সহ আমাদের পণ্য গ্যালারী চিত্রগুলির আমদানি কাজ বন্ধ করে দিয়েছে। ত্রুটিটি একটি মেমরি সীমা (যা সর্বাধিক ওপেন ফাইল আকারের সীমা হতে পারে) এর কারণে is

আমার ধারণাটি হ'ল, আমদানির মাধ্যমে খোলা ফাইলগুলি সঠিকভাবে বন্ধ হবে না।

আমি আরও দেখেছি যে এখানে কিছু খালি destruct()ফাংশন চালু হয়েছিল ( Mage_ImportExport_Model_Import_Adapter_Abstract) - তবে পিতামাতার যুক্তিগুলির সাথে এটির প্রসারিত করা কোনও লাভ করে না।

উত্তর:


14

দেখে মনে হচ্ছে যে তারা চিত্রের উত্সটি ধ্বংস করার চেষ্টা করেছে তবে পরিবর্তে একটি মেমরি ফাঁস প্রবর্তন করেছে। আমি এই কোডের একটি সঠিক কারণ, সত্য বলতে পারি না, তবে আমি কী পরিবর্তন করা হয়েছে তা ব্যাখ্যা করতে পারি:

মূলত, imagedestroy()ডেস্কট্রাক্টরে ডাকা হত__destruct()

function __destruct()
{
    @imagedestroy($this->_imageHandler);
}

যখনই পিএইচপি আবর্জনা সংগ্রহকারী অব্যবহৃত বস্তুগুলি (যেমন মেমরিতে থাকা বস্তুগুলিকে আর উল্লেখ করা হয় না) ধ্বংস করে তবেই ডাস্ট্রাক্টরকে ডাকা হয়।

এখন, imagedestroy()পরিবর্তে একটি শাটডাউন ফাংশন বলা হয় এবং যেহেতু এটি Varien_Image_Adapter_Gd2বস্তুর কোনও পদ্ধতির কলব্যাক , এটি এমনকি শেষ অবধি অবধি আবর্জনা সংগ্রহ করা যায় না। স্ক্রিপ্টের কার্যকারিতা শেষ না হওয়া পর্যন্ত সমস্ত চিত্রের সংস্থান খোলা থাকে।


ব্যাখ্যার জন্য ধন্যবাদ - এই আমি ভেবেছিলাম। সুতরাং সামগ্রিকভাবে, এই চালু কোডটি বেশিরভাগ আমদানিকে 1.9.2 এ অকেজো করে তোলে। আমার চোখে. আশা করি এটি শিগগিরই ঠিক হয়ে যাবে। কোন পরামর্শ কোথায় একটি বাগ রিপোর্ট খুলতে?
আছিম রোজেনহেগেন

6

আমার ম্যাজেন্টো 1.9.2.0 এর সাথে একই সমস্যা হচ্ছে ...

আমি শুধু পরিবর্তন করে কাজ করার জন্য এই পেতে Varien_Image_Adapter_Gd2 মধ্যে /lib/Varien/Image/Adapter/Gd2.phpনিম্নরূপ:

public function __construct()
{
    // Initialize shutdown function
    // register_shutdown_function(array($this, 'destruct'));
}

/**
 * Destroy object image on shutdown
 */
public function __destruct()
{
    @imagedestroy($this->_imageHandler);
}
  • রেজিস্টার_শটডাউন_ফাংশন সহ লাইন সরান (বা মন্তব্য করুন)
  • পরিবর্তন ফাংশনের নাম নষ্ট করার __destruct

আমি মেমরি_লিট 1 জি তে ফিরে রেখেছি (আগে আমি 32 গিগাবাইট পর্যন্ত বাড়িয়েছিলাম) এবং এখন এটি কার্যকর হয় ...

এই প্রকল্পটি মোডম্যান বান্ধব উপায়ে প্রক্রিয়াটি প্রয়োগ করে। এটি কেবল সুরকারের সাথে ইনস্টল করুন এবং আপনি যেতে ভাল।


এটি আসলে প্রশ্নের উত্তর দেয় না। আপনি কি অন্য কিছু প্রশ্ন থাকে, তাহলে আপনি এটি ক্লিক করে অনুরোধ করতে পারেন প্রশ্ন জিজ্ঞাসা করুন । আপনি এটিও করতে পারেন একটি খয়রাত যোগ একবার আপনি যথেষ্ট আছে এই প্রশ্নের আরো দৃষ্টি আকর্ষণ করতে খ্যাতি
রাজীব কে তোমি

হ্যাঁ, এটি প্রশ্নের উত্তর দেয় না তবে অস্থায়ী সমাধান এবং আলোচনার প্রয়োজন নেই এমন লোকদের সহায়তা করবে
dkr

আমদানির সময় মেমরির খরচ সহ একটি সমস্যা স্থির করে। মজার, ম্যাগন্টো কি কোনওভাবে তারা কী প্রকাশ করছে তা পরীক্ষা করে?
ক্লিপাচ

এটি কেবল আমদানি সমস্যার সমাধান করে না। এটি প্রক্রিয়া দ্বারা একটি বড় মেমরি খাওয়ার সমাধান করে যা প্রতিটি পণ্যের চিত্রগুলির জন্য ক্যাশে এবং পুনরায় আকারিত সংস্করণ তৈরি করে। আমি যদি আমার পণ্যগুলিতে পিএনজি চিত্রগুলি আপলোড করি তবে এই "হ্যাক" ব্যতীত আমি কাজ করতে পারি না এবং আমি প্রচুর স্মৃতিতে ক্লান্ত ত্রুটি পেয়েছি।
সিম্বুস 82 ই

আজ আমি এই পরামর্শ পেয়েছি। আমি এটি বাস্তবায়ন করেছি এবং স্মৃতি ফাঁস হয়ে গেছে। তারপরে আমি এটিকে পরিষ্কার উপায়ে ইনস্টল করতে এই github.com/borasocom-team/magento-gd2-mmoryleak তৈরি করেছি ।
ডঃ জিয়ানলুইগি জেন ​​জ্যানেটিটিনি

5

এটি আনসিরিয়ালাইজড সহ সুরক্ষা বিষয়গুলি ঠিক করার অংশ ছিল। __স্ট্রাস্ট্রিকের মতো যাদু পদ্ধতিতে সিরিয়ালাইজেশন সহ অন্তর্নিহিত সমস্যা রয়েছে।

আমরা প্রস্তাবিত শোষণগুলি দেখেছি যা সিরিয়ালাইজেশন ব্যবহার করে এবং ফাইল সিস্টেমে ফাইল তৈরির জন্য __রীক্ষা করেছিল - এবং এটি এড়ানোর জন্য এই পরিবর্তনটি (আপনি অন্য জায়গায় আরও অনুরূপ পরিবর্তন দেখতে পাবেন) করা হয়েছিল।

এটি কি স্মৃতি ফাঁসির কারণ বা স্ক্রিপ্ট শেষ না হওয়া পর্যন্ত আরও মেমরি ব্যবহার করে?

/security/77549/is-php-unserialize-exploitable-without-any-interesting-methods


প্রসঙ্গে ধন্যবাদ। এই নির্দিষ্ট পরিবর্তনটি কোনও নির্দিষ্ট শোষণ রোধ করতে বা কেবল নিশ্চিত হওয়ার জন্য করা হয়েছে?
ফ্যাবিয়ান শেমংলার

এবং না, এটি সম্ভবত স্ক্রিপ্টটি আরও মেমরি গ্রাস করে, সত্যিকারের মেমরি ফাঁস নয়
ফ্যাবিয়ান শেমংলার

বিশেষত চিত্র আমদানি করার সময় এটি একটি বিশাল মেমরি ফাঁসির কারণ এটি আমদানি প্রক্রিয়াজাতকরণ শেষ না হওয়া অবধি সমস্ত চিত্র ফাইল খোলা রাখবে। এইভাবে আমরা প্রায় আনুমানিক 50 টি পণ্য আমদানি করতে পারি (আমরা সম্ভবত 2k এর আমদানি করতে পারার আগে)। আমি 8G র‍্যাম সহ একটি স্থানীয় ভিএম-তে আমার পরীক্ষা চালিয়েছি এবং উত্স ফাইলগুলি প্রায় 300KB। পরিবর্তনের আগে পিএইচপি দ্বারা ব্যবহৃত মেমরি পুরো আমদানির সময় 1 কে পুনরায় শুরু হয়।
আছিম রোজেনহেগেন

fschmengler অধিকার - এটা একটি 'মেমরি লিক' নাও হতে পারে কিন্তু খরচ পাহাড় thraight ;-) যায়
সালে Achim Rosenhagen

1
@ পরামর্শের জন্য অ্যালেক্স ধন্যবাদ। আমি এটা উল্টে দিয়েছি। এখন, মেমরি ফাঁস হয়ে গেছে তবে ভবিষ্যতের কোনও সমাধান নেই।
আরনে

4

তাই আমি ম্যাজেন্টোতে একটি "সমাধান" সহ একটি বাগ উত্থাপন করেছি যা চিত্র আমদানি প্রক্রিয়ায় মেমরির ব্যবহার সংক্রান্ত সমস্যাগুলি মোকাবেলা করতে পারে।

সমাধানটি https://github.com/sitewards/import_image_memory_leak_fix এর অধীনে গিথুবে পাওয়া যাবে তবে মূল ধারণাটি।

ইমেজ প্রসেসরের পদ্ধতিটি Mage_Catalog_Helper_Image::validateUploadFileকল করার জন্য স্থির করা destruct। দুঃখজনকভাবে মনে হচ্ছে ডিফল্ট কোনওরূপে কাজ Varien_Imageকরে না destructতাই আমাদের নিজের ক্লাসটি যুক্ত করতে হয়েছে।

<?php
/**
 * @category    Sitewards
 * @package     Sitewards_ImportImageMemoryLeakFix
 * @copyright   Copyright (c) Sitewards GmbH (http://www.sitewards.com/)
 */
class Sitewards_ImportImageMemoryLeakFix_Model_Destructable_Image extends Varien_Image
{
    /**
     * Constructor,
     * difference from original constructor - we register a destructor here.
     *
     * @param string $sFileName
     * @param Varien_Image_Adapter $oAdapter Default value is GD2
     */
    public function __construct($sFileName = null, $oAdapter = Varien_Image_Adapter::ADAPTER_GD2)
    {
        parent::__construct($sFileName, $oAdapter);

        // Initialize shutdown function
        register_shutdown_function(array($this, 'destruct'));
    }

    /**
     * Destroy object image on shutdown
     */
    public function destruct()
    {
        $oAdapter = $this->_getAdapter();
        if (method_exists($oAdapter, 'destruct')) {
            $oAdapter->destruct();
        } else {
            Mage::log('Image can not be destructed properly, adapter doesn\'t support the method.');
        }
    }
}

এবং তারপরে সহায়কটির পুনর্লিখন।

<?xml version="1.0"?>
<config>
    <modules>
        <Sitewards_ImportImageMemoryLeakFix>
            <version>0.1.0</version>
        </Sitewards_ImportImageMemoryLeakFix>
    </modules>
    <global>
        <models>
            <sitewards_importimagememoryleakfix>
                <class>Sitewards_ImportImageMemoryLeakFix_Model</class>
            </sitewards_importimagememoryleakfix>
        </models>
        <helpers>
            <catalog>
                <rewrite>
                    <image>Sitewards_ImportImageMemoryLeakFix_Helper_Catalog_Helper_Image</image>
                </rewrite>
            </catalog>
        </helpers>
    </global>
</config>

এবং নতুন ফাংশন নতুন ধ্বংসাত্মক ইমেজ বর্গ কল।

<?php
/**
 * @category    Sitewards
 * @package     Sitewards_ImportImageMemoryLeakFix
 * @copyright   Copyright (c) Sitewards GmbH (http://www.sitewards.com/)
 */
class Sitewards_ImportImageMemoryLeakFix_Helper_Catalog_Helper_Image extends Mage_Catalog_Helper_Image
{
    /**
     * Check - is this file an image
     *
     * Difference from original method - we destroy the image object here,
     * i.e. we are not wasting memory, without that fix product import with images
     * easily goes over 4Gb on memory with just couple hundreds of products.
     *
     * @param string $sFilePath
     *
     * @return bool
     * @throws Mage_Core_Exception
     */
    public function validateUploadFile($sFilePath) {
        if (!getimagesize($sFilePath)) {
            Mage::throwException($this->__('Disallowed file type.'));
        }

        /** @var Sitewards_ImportImageMemoryLeakFix_Model_Destructable_Image $oImageProcessor */
        $oImageProcessor = Mage::getModel('sitewards_importimagememoryleakfix/destructable_image', $sFilePath);
        $sMimeType       = $oImageProcessor->getMimeType();
        $oImageProcessor->destruct();

        return $sMimeType !== null;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.