Magento 2.2: मान को अनसुना करने में असमर्थ?


33

Magento 2.2.0-rc3.0 / PHP 7.0.23 को चलाने वाली साइट पर मुद्दों में चल रहा है

निम्न समस्या सभी तृतीय पक्ष एक्सटेंशन के साथ या तो सक्षम या अक्षम है।

श्रेणी या उत्पाद पृष्ठ से तुलना करने के लिए कोई आइटम जोड़ने या उत्पाद पृष्ठ से समीक्षा सबमिट करने पर हमें ब्राउज़र में निम्न त्रुटि मिलती है:

1 exception(s):
Exception #0 (InvalidArgumentException): Unable to unserialize value.

Exception #0 (InvalidArgumentException): Unable to unserialize value.
#0 /home/___/public_html/app/code/Magento/Theme/Controller/Result/MessagePlugin.php(157): Magento\Framework\Serialize\Serializer\Json->unserialize('[{\\"type\\":\\"su...')
#1 /home/___/public_html/app/code/Magento/Theme/Controller/Result/MessagePlugin.php(135): Magento\Theme\Controller\Result\MessagePlugin->getCookiesMessages()
#2 /home/___/public_html/app/code/Magento/Theme/Controller/Result/MessagePlugin.php(84): Magento\Theme\Controller\Result\MessagePlugin->getMessages()
#3 /home/___/public_html/lib/internal/Magento/Framework/Interception/Interceptor.php(146): Magento\Theme\Controller\Result\MessagePlugin->afterRenderResult(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Magento\Framework\View\Result\Page\Interceptor), Object(Magento\Framework\App\Response\Http\Interceptor))
#4 /home/___/public_html/lib/internal/Magento/Framework/Interception/Interceptor.php(153): Magento\Framework\View\Result\Page\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#5 /home/___/public_html/generated/code/Magento/Framework/View/Result/Page/Interceptor.php(26): Magento\Framework\View\Result\Page\Interceptor->___callPlugins('renderResult', Array, Array)
#6 /home/___/public_html/lib/internal/Magento/Framework/App/Http.php(139): Magento\Framework\View\Result\Page\Interceptor->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#7 /home/___/public_html/lib/internal/Magento/Framework/App/Bootstrap.php(256): Magento\Framework\App\Http->launch()
#8 /home/___/public_html/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#9 {main}

जब तक आप कुकीज़, विशेष रूप से, मैसेज-मैसेज कुकी को साफ़ नहीं करते, तब तक त्रुटि दूर नहीं होती है। यहां छवि विवरण दर्ज करें

इन त्रुटियों के निवारण में कोई सहायता की सराहना की है।


यह एक मुख्य बग नहीं है? क्या इसके लिए GitHub मुद्दा है?
एलेक्स

यह आपको एक विचार देगा scommerce-mage.com/blog/…
stevensagaar

जवाबों:


59

मैं सीएलआई से अपने रेडिस कैश फ्लश करके इस मुद्दे को हल करने में सक्षम था

redis-cli flushall

मुझे उम्मीद है कि यह भविष्य के उपयोगकर्ताओं को मदद करता है।


2
अच्छी तरह से किया। यह संभवतः स्वीकृत उत्तर होना चाहिए।
शॉन अब्रामसन

ऐसा लगता है कि हमेशा समाधान नहीं होगा। मेरे मामले में मैं रेडिस (अभी तक) का उपयोग नहीं करता हूं
एलेक्स

धन्यवाद। मैंने वार्निश को फिर से शुरू किया, यह सोचकर कि यह बह जाएगा, लेकिन यह चाल चली।
लाड़ली ३०००

यह मेरे लिए काम करता है
जारेड चू

2.2.9 से 2.3.2 तक अपग्रेड करते समय इसने मेरी मदद की। मुझे त्रुटि मिली जब मैंने php bin / magento सेटअप
मोहम्मद जोराड

30

समस्या /vendor/magento/framework/Serialize/Serializer/Json.php में एक फ़ंक्शन अनसेरीलाइज़ ($ स्ट्रिंग) है जो आपको स्ट्रिंग को अनुक्रमित करने पर एक सिंटैक्स त्रुटि देता है (json नहीं बल्कि php serialization)।

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

public function unserialize($string)
{
    if($this->is_serialized($string))
    {
        $string = $this->serialize($string);
    }
    $result = json_decode($string, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
         throw new \InvalidArgumentException('Unable to unserialize value.');

    }
    return $result;
}

और तार जोड़ने के लिए जाँच करने के लिए फ़ंक्शन जोड़ें:

function is_serialized($value, &$result = null)
{
    // Bit of a give away this one
    if (!is_string($value))
    {
        return false;
    }
    // Serialized false, return true. unserialize() returns false on an
    // invalid string or it could return false if the string is serialized
    // false, eliminate that possibility.
    if ($value === 'b:0;')
    {
        $result = false;
        return true;
    }
    $length = strlen($value);
    $end    = '';
    switch ($value[0])
    {
        case 's':
            if ($value[$length - 2] !== '"')
            {
                return false;
            }
        case 'b':
        case 'i':
        case 'd':
            // This looks odd but it is quicker than isset()ing
            $end .= ';';
        case 'a':
        case 'O':
            $end .= '}';
            if ($value[1] !== ':')
            {
                return false;
            }
            switch ($value[2])
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                    break;
                default:
                    return false;
            }
        case 'N':
            $end .= ';';
            if ($value[$length - 1] !== $end[0])
            {
                return false;
            }
            break;
        default:
            return false;
    }
    if (($result = @unserialize($value)) === false)
    {
        $result = null;
        return false;
    }
    return true;
}

Fe बचाने के बाद। समस्या के बिना श्रेणी, आप डिफ़ॉल्ट रूप से वर्ग को पुनर्स्थापित कर सकते हैं और भविष्य में ऐसी समस्या नहीं होगी।


1
यह मेरे लिए 100% ठीक काम कर रहा है। आपका बहुत बहुत धन्यवाद!
मापलडिय़ा

2
यह काम नहीं कर रहा है ... :-(
अरफान मिर्जा

जाँच करें कि क्या होता है यदि मान a: 0: {} पास है। लाइन से लाइन जाओ। यदि अनसेरिज़लाइज़ का परिणाम एक मजबूत टाइप किए गए तरीके से पारित हो जाता है, जो एक सरणी की उम्मीद कर रहा है तो क्या होगा? आप अपना उत्तर बदलना चाहते हैं।
vitoriodachef

20

समाधान के लिए कोर फ़ाइलों को संपादित न करें। निम्नलिखित तरीके से ओवरराइड करें। डाइरेक्सिल आदि निर्देशिका के अंदर बस निम्नलिखित लाइन डालें

<preference for="Magento\Framework\Serialize\Serializer\Json" type="Namespace\ModuleName\Serialize\Serializer\Json" />

और Namespace \ ModuleName \ Serialize \ Serializer निर्देशिका के अंदर: फ़ाइल Json.php

<?php
namespace Namespace\ModuleName\Serialize\Serializer;



class Json extends \Magento\Framework\Serialize\Serializer\Json
{


    /**
     * {@inheritDoc}
     * @since 100.2.0
     */
    public function unserialize($string)
    {
      if($this->is_serialized($string))
        {
            $string = $this->serialize($string);
        }
        $result = json_decode($string, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
             throw new \InvalidArgumentException('Unable to unserialize value.');

        }
        return $result;
    }


    function is_serialized($value, &$result = null)
    {
    // Bit of a give away this one
        if (!is_string($value))
        {
            return false;
        }
        // Serialized false, return true. unserialize() returns false on an
        // invalid string or it could return false if the string is serialized
        // false, eliminate that possibility.
        if ($value === 'b:0;')
        {
            $result = false;
            return true;
        }
        $length = strlen($value);
        $end    = '';
        switch ($value[0])
        {
            case 's':
                if ($value[$length - 2] !== '"')
                {
                    return false;
                }
            case 'b':
            case 'i':
            case 'd':
                // This looks odd but it is quicker than isset()ing
                $end .= ';';
            case 'a':
            case 'O':
                $end .= '}';
                if ($value[1] !== ':')
                {
                    return false;
                }
                switch ($value[2])
                {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                    case 9:
                        break;
                    default:
                        return false;
                }
            case 'N':
                $end .= ';';
                if ($value[$length - 1] !== $end[0])
                {
                    return false;
                }
                break;
            default:
                return false;
        }
        if (($result = @unserialize($value)) === false)
        {
            $result = null;
            return false;
        }
        return true;
    }
}

अच्छी तरह से काम


2
कार्यान्वयन त्रुटिपूर्ण है। यदि मान a: 0: {} Json: unserialize मेथड को पास किया जाता है तो क्या होगा? क्या यह वांछित व्यवहार है? Is_serialized विधि में परिणाम चर का बिंदु क्या है? इसे वापस नहीं किया गया है और इसका किसी भी चीज पर प्रभाव नहीं पड़ता है क्योंकि विधि कॉल कोई चर दूसरे तर्क के रूप में पारित नहीं होता है।
vitoriodachef

यह स्वीकृत समाधान होना चाहिए, और सीधे विक्रेता में फ़ाइल को संपादित करने के लिए ऊपर दिए गए पोस्ट से बेहतर है। संभावना से अधिक, आपको सेटअप अपग्रेड कार्य को स्थानीय स्तर पर और फिर से स्टेजिंग / प्रोडक्शन पर चलाना होगा, इसलिए इसे पर्यावरण को बनाए रखना होगा और वेंडर / डायरेक्टरी बिल्ड टाइम पर बनाई गई एक कलाकृति है।
मार्क शस्ट

@vitoriodachef मैं आपके द्वारा उल्लिखित सटीक मामले का सामना कर रहा हूं। क्या आपको कोई समाधान मिला है?
नाइट ०१

मैंने निजी फ़ंक्शन
नाइट ०१

काम नहीं किया। मैं मैन्युअल रूप से डीबी में सभी प्रविष्टियों बदलना पड़ा a:0:{}करने के लिए[]
स्थानीय होस्ट

16

मेरे मामले में, मैं एक धारावाहिक स्ट्रिंग का अनावरण करने के लिए इस प्रकार है: फ़ाइल: /vendor/magento/framework/Serialize/Serializer/Json.php

खोजें:

public function unserialize($string)
{
    $result = json_decode($string, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new \InvalidArgumentException('Unable to unserialize value.');
    }
    return $result;
}

के द्वारा बदला गया:

public function unserialize($string)
{
    $result = json_decode($string, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        if(false !== @unserialize($string)){
            return unserialize($string);
        }
        throw new \InvalidArgumentException('Unable to unserialize value.');
    }
    return $result;
}

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

आप किन मुद्दों का सामना कर रहे थे?
मैजेलियर

मुद्दा तय हो गया। पूछने के लिए धन्यवाद!
शिव

1
जीआरटी ... धन्यवाद !!!
मैजेलियर

1
धन्यवाद @ MageLearner, यह भी 2.3.1 में काम करने के बाद Magento 1 से Magento 2 के डेटा को स्थानांतरित करने के लिए
प्रदीप ठाकुर

5

Redis को फ्लश करने के बाद समस्या हल हो गई है। समाधान के लिए धन्यवाद क्रेग

मैं कैश के लिए पोर्ट 6379 का उपयोग कर रहा हूं, इसलिए मैं कमांड चलाता हूं:

redis-cli -p 6379 flushall

4

यह ज्यादातर रेडिस कैश से संबंधित है, इसलिए अपने एसएसएच में सरल कमांड के साथ इसे बाहर निकालने की कोशिश करें

redis-cli flushall


3

यह एक अनुमतियों का मुद्दा निकला, जहां मैगेंटो इस सर्वर पर प्रतिबंधित फ़ाइलों के लिए अनुमतियाँ सेट कर रहा था।

सर्वर के लिए उपयुक्त umask के साथ रूट डायरेक्टरी में magento_umask फ़ाइल बनाकर हल किया गया।

अतिरिक्त जानकारी के लिए http://devdocs.magento.com/guides/v2.2/install-gde/install/post-install-umask.html देखें ।


हैलो, मैं इस तरह से संबंधित मुद्दे का सामना कर रहा हूं। आप करने के लिए देखने के लिए कृपया इस
आदित्य शाह

@ मेरे सभी डायर 755 हैं, और फाइलें 644 हैं, सेट करने के लिए उपयुक्त ऑमस्क क्या है? टिया
क्रिस वेन

2

ऊपर दिए गए समीर के उत्तर ने मेरे लिए काम किया हालांकि मुझे ब्लॉक में अलग कोड का उपयोग करना पड़ा।

public function serialize($data)
{
    $result = json_encode($data);
    if (false === $result) {
        throw new \InvalidArgumentException('Unable to serialize value.');
    }
    return $result;
}

function is_serialized($value, &$result = null)
{
    // Bit of a give away this one
    if (!is_string($value))
    {
        return false;
    }
    // Serialized false, return true. unserialize() returns false on an
    // invalid string or it could return false if the string is serialized
    // false, eliminate that possibility.
    if ($value === 'b:0;')
    {
        $result = false;
        return true;
    }
    $length = strlen($value);
    $end    = '';
    switch ($value[0])
    {
        case 's':
            if ($value[$length - 2] !== '"')
            {
                return false;
            }
        case 'b':
        case 'i':
        case 'd':
            // This looks odd but it is quicker than isset()ing
            $end .= ';';
        case 'a':
        case 'O':
            $end .= '}';
            if ($value[1] !== ':')
            {
                return false;
            }
            switch ($value[2])
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                    break;
                default:
                    return false;
            }
        case 'N':
            $end .= ';';
            if ($value[$length - 1] !== $end[0])
            {
                return false;
            }
            break;
        default:
            return false;
    }
    if (($result = @unserialize($value)) === false)
    {
        $result = null;
        return false;
    }
    return true;
}

/**
 * {@inheritDoc}
 */
public function unserialize($string)
{
    if($this->is_serialized($string))
        {
        $result = $this->serialize($string);
        }
    $result = json_decode($string, true);

    return $result;
}

1

जड़ निर्देशिका 1। public_html/vendor/magento/framework/Serialize/Serializer/Json.php

डाउनलोड JSON.php https://gist.github.com/manojind/9f18bbecaeb3e2bbfb056a634ade62a2

2. बस नीचे दिए गए फंक्शन को बदलें (अनसेरिज़ल) और नया फंक्शन जोड़ें या सिर्फ अटैच की गई फाइल को डाउनलोड करें और डिफॉल्ट से बदलें

public function unserialize($string)
{
    if($this->is_serialized($string))
    {
        $string = $this->serialize($string);
    }
    $result = json_decode($string, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
         throw new \InvalidArgumentException('Unable to unserialize value.');

    }
    return $result;
}

3. नया फ़ंक्शन जोड़ें:

function is_serialized($value, &$result = null)
{

    if (!is_string($value))
    {
        return false;
    }

    if ($value === 'b:0;')
    {
        $result = false;
        return true;
    }
    $length = strlen($value);
    $end    = '';
    switch ($value[0])
    {
        case 's':
            if ($value[$length - 2] !== '"')
            {
                return false;
            }
        case 'b':
        case 'i':
        case 'd':
                       $end .= ';';
        case 'a':
        case 'O':
            $end .= '}';
            if ($value[1] !== ':')
            {
                return false;
            }
            switch ($value[2])
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                    break;
                default:
                    return false;
            }
        case 'N':
            $end .= ';';
            if ($value[$length - 1] !== $end[0])
            {
                return false;
            }
            break;
        default:
            return false;
    }
    if (($result = @unserialize($value)) === false)
    {
        $result = null;
        return false;
    }
    return true;
} 

मेरा मुद्दा तय नहीं हुआ..प्लीज मेरी मदद करें
मुहम्मद अहमद

1

मुझे व्यक्तिगत रूप से यह मुद्दा मिला कि यह कमांड चला रहा है।

php bin/magento setup:upgrade

प्रवास के बाद। मुझे पता चला कि मुझे " क्रिप्ट " हैश कुंजी याद आ रही है src/app/etc/env.php:

<?php
return [
    'backend' => [
        'frontName' => 'admin'
    ],
    'crypt' => [
        'key' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ],

    ...

सुनिश्चित करें कि यह खाली नहीं है और अधिमानतः आपकी परियोजनाओं के अन्य वातावरण से मेल खाता है!


मैंने स्थापना के दौरान क्रिप्ट कुंजी को खाली छोड़ दिया, जिससे एक नया उत्पन्न होने की उम्मीद है, जो स्पष्ट रूप से नहीं होता है।
शपेशेश्टर

0

मुझे सामने के अंत में एक सीएमएस पृष्ठ में त्रुटि मिल रही थी।

यह CMS पृष्ठ सामग्री में Magento विजेट कोड था जो समस्या पैदा कर रहा था (जिसे मैंने किसी अन्य स्रोत से कॉपी किया था)। मैंने विजेट कोड को हटा दिया और CMS पेज एडिट स्क्रीन में इन्सर्ट विजेट बटन का उपयोग करके उसी विजेट को डाला और यह काम कर गया।

उपरोक्त प्रक्रिया ने विजेट कोड को अलग तरीके से स्वरूपित किया और इसने त्रुटि को दूर कर दिया।


0

मुझे पता चला कि TEXTडेटा के साथ एक डेटाबेस MySQL टेबल कॉलम में पूरे क्रमबद्ध डेटा को फिट नहीं किया जा सकता है ।
मुझे बस का कॉलम flag_dataमान मिलाsystem_config_snapshot लाइन का छंटा हुआ है।

मुझे MEDIUMTEXTइस कॉलम के लिए इसे बदलना पड़ा flag.flag_data


0

वही त्रुटि थी। जब नए सिरे से कोड (2.3.2 देखें) के साथ डेटाबेस (2.2.6 देखें) को अपडेट करने की कोशिश की गई।

तय करने के लिए - भाग गया

composer update

0

यह सीधे sql चलाने का सबसे अच्छा तरीका नहीं है, लेकिन मैंने अपना समय बचाने के लिए ऐसा किया है। बस इस क्वेरी को चलाएं

ALTER TABLE flag MODIFY flag_data LONGTEXT;
UPDATE flag SET flag_data = '{"system":"","scopes":"","themes":""}' WHERE flag_code = 'config_hash';
UPDATE flag SET flag_data = '{}' WHERE flag_code = 'system_config_snapshot';

0

यदि आप 2.3.0 या इससे अधिक उम्र के हैं, तो आप MageLearner द्वारा प्रदान किए गए समाधान का उपयोग करना चाहेंगे। केस स्टेटमेंट वाला पुराना तरीका अप्रचलित है। यदि आप 2.3.0 या उससे अधिक पर MageLearner के समाधान का उपयोग नहीं करते हैं; आप ऑर्डर डेटा और कॉन्फ़िगर करने योग्य उत्पादों को देखने के साथ सभी प्रकार की समस्याओं को मार देंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.