1.9.2.0 में Varien_Image_Adapter_Gd2 के नए विध्वंसक के साथ ImportExport समस्या


23

क्या कोई समझा सकता है कि, Magento CE 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);
}

उन दो कार्यों को जोड़ने के बाद, ImportExport इंटरफ़ेस के साथ उत्पाद गैलरी छवियों के हमारे आयात ने काम करना बंद कर दिया। त्रुटि एक मेमोरी सीमा (जो अधिकतम खुली फ़ाइल आकार सीमा के लिए आती है) के कारण है।

मेरा विचार यह है कि आयात द्वारा खोली गई फाइलें सही ढंग से बंद नहीं होंगी।

मैंने यह भी देखा कि कुछ खाली destruct()कार्य शुरू किए गए थे ( Mage_ImportExport_Model_Import_Adapter_Abstract) - लेकिन अभिभावक के तर्क से मेल खाने के लिए उन का विस्तार करना मदद नहीं करता है।

जवाबों:


14

ऐसा लगता है कि उन्होंने छवि संसाधन को नष्ट करने के लिए सुनिश्चित करने की कोशिश की, लेकिन इसके बजाय स्मृति रिसाव की शुरुआत की। मैं इस कोड के लिए एक वैध कारण के बारे में सोच नहीं सकता, ईमानदार होने के लिए, लेकिन मैं बता सकता हूं कि क्या बदला गया है:

मूल रूप से, imagedestroy()डिसक्ट्रक्टर में कहा जाता होगा__destruct()

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

जब भी PHP कचरा संग्राहक अनुपयोगी वस्तुओं (अर्थात ऐसी वस्तुओं को नष्ट कर दिया जाता है जिन्हें अब संदर्भित नहीं किया जाता है) को नष्ट करने वाला कहा जाता है।

अब, imagedestroy()इसके बजाय एक शटडाउन फ़ंक्शन में कॉल किया जाता है और चूंकि यह Varien_Image_Adapter_Gd2ऑब्जेक्ट की एक विधि का कॉलबैक है , इसलिए इसे बहुत अंत तक कचरा एकत्र नहीं किया जा सकता है। इस तरह से सभी छवि संसाधन तब तक खुले रहते हैं जब तक स्क्रिप्ट निष्पादन समाप्त नहीं हो जाता।


स्पष्टीकरण के लिए धन्यवाद - यही मैंने सोचा था। तो कुल मिलाकर, यह पेश कोड 1.9.2 पर आयात के बहुमत को बेकार कर देता है। मेरी आँखों में। उम्मीद है कि इसे जल्द ही ठीक कर लिया जाएगा। बग रिपोर्ट खोलने के लिए कोई सलाह?
अचिम रोसेनगेन

6

मेरे Magento 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);
}
  • register_shutdown_function (या टिप्पणी बाहर) के साथ लाइन निकालें
  • परिवर्तन समारोह नाम __destruct के लिए विनाश

मैंने 1G पर मैमोरी_लिमिट सेट किया है (पहले मैं 32GB तक बढ़ा था) और अब यह काम करता है ...

इस परियोजना के क्रियान्वयन ने मोडमैन के अनुकूल तरीके से प्रक्रिया को कहा। बस इसे संगीतकार के साथ स्थापित करें और आप जाने के लिए अच्छे हैं।


यह वास्तव में सवाल का जवाब नहीं देता है। यदि आपका कोई अलग प्रश्न है, तो आप प्रश्न पूछें पर क्लिक करके पूछ सकते हैं । पर्याप्त प्रतिष्ठा होने पर आप इस प्रश्न पर अधिक ध्यान आकर्षित करने के लिए एक इनाम भी जोड़ सकते हैं ।
राजीव के टॉमी

हां, यह सवाल का जवाब नहीं देता है, लेकिन ऐसे लोगों की मदद करेगा जिन्हें एक अस्थायी समाधान की आवश्यकता है और कोई चर्चा नहीं है
dkr

आयात के दौरान मेमोरी की खपत के साथ एक मुद्दा तय किया। दिलचस्प है, क्या Magento किसी भी तरह परीक्षण करता है कि वे क्या जारी कर रहे हैं?
klipach

यह न केवल आयात समस्या को हल करता है। यह उस प्रक्रिया द्वारा खाने वाली एक बड़ी मेमोरी को हल करता है जो कैश और रिसाइज्ड वर्जन को हर प्रोडक्ट इमेज के लिए तैयार करता है। अगर मैं अपने उत्पादों में png छवियां अपलोड करता हूं, तो इस "हैक" के बिना मैं काम नहीं कर सकता और मुझे बहुत सारी मेमोरी समाप्त हो गई त्रुटियां प्राप्त होती हैं।
सिमबस 82

आज मुझे यह सुझाव मिला। मैंने इसे लागू किया और मेमोरी लीक हो गया। फिर मैंने इसे साफ तरीके से स्थापित करने के लिए यह github.com/borasocom-team/magento-gd2-memoryleak बनाया ।
डॉ। जियानलुइगी ज़ेन ज़नेटिनी

5

यह गैरकानूनी के साथ सुरक्षा मुद्दों को ठीक करने का हिस्सा था। जादू की तरह __destruct में क्रमांकन के साथ अंतर्निहित मुद्दे हैं।

हमने प्रस्तावित कारनामों को देखा है जो फ़ाइल सिस्टम में फ़ाइलों को बनाने के लिए क्रमांकन और __destruct का उपयोग कर रहे थे - और यह परिवर्तन (आप अन्य स्थानों में अधिक समान परिवर्तन देखेंगे) इससे बचने के लिए किया गया था।

क्या यह मेमोरी लीक का कारण बनता है या स्क्रिप्ट खत्म होने तक अधिक मेमोरी का उपयोग करता है?

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


संदर्भ के लिए धन्यवाद। क्या यह विशेष परिवर्तन एक विशिष्ट शोषण को रोकने के लिए किया गया है या सिर्फ सुनिश्चित करने के लिए किया गया है?
फेबियन शेंगलर

और नहीं, यह शायद सिर्फ स्क्रिप्ट को अधिक मेमोरी का उपभोग करता है, न कि एक वास्तविक मेमोरी लीक
फैबियन शेंगलर

यह विशेष रूप से छवियों को आयात करते समय एक बड़ी स्मृति रिसाव का कारण बनता है, क्योंकि यह आयात प्रसंस्करण के अंत तक सभी छवि फ़ाइलों को खुला रखेगा। इस तरह हम केवल लगभग 50 उत्पादों का आयात कर सकते हैं (इससे पहले कि हम 2k का आयात कर सकें)। मैंने अपना परीक्षण स्थानीय वीएम पर 8 जी रैम के साथ चलाया और स्रोत फाइलें लगभग 300KB हैं। पूरे आयात के दौरान 1k पर PHP rermains द्वारा उपयोग की गई मेमोरी को बदलने से पहले।
अचिम रोसेनगेन

fschmengler सही है - यह एक 'मेमोरी लीक' नहीं हो सकता है, लेकिन खपत पहाड़ी तक जाती है ;-)
Achim Rosenhagen

1
@ सलाह के लिए धन्यवाद। मैंने उसे उल्टा कर दिया। अब, स्मृति रिसाव चला गया है, लेकिन भविष्य के लिए कोई समाधान नहीं है।
अर्ने

4

इसलिए मैंने मैगेंटो के साथ एक "समाधान" सहित एक बग उठाया, जो छवि आयात प्रक्रिया में मेमोरी उपयोग के मुद्दों से निपटना चाहिए।

इसका समाधान github पर 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;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.