ম্যাজেন্টো ২.২: মানটি আনসিরিয়ালাইজ করতে অক্ষম?


33

Magento 2.2.0-rc3.0 / পিএইচপি 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}

আপনি কুকি পরিষ্কার না করে ত্রুটিটি মুছে যায় না, বিশেষত, ম্যাগ-বার্তা কুকি। এখানে চিত্র বর্ণনা লিখুন

এই ত্রুটিগুলি সমাধানের জন্য যে কোনও সহায়তা প্রশংসিত হয়।


এটি একটি কোর বাগ নয়? এই জন্য একটি গিটহাব ইস্যু আছে?
অ্যালেক্স

এটি আপনাকে একটি ধারণা দেবে scommerce-mage.com/blog/…
স্টিভেনসাগার

উত্তর:


59

আমি সিডিএল থেকে আমার রেডিস ক্যাশে ফ্লাশ করে এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি

redis-cli flushall

আমি আশা করি এটি ভবিষ্যতের ব্যবহারকারীদের সহায়তা করে।


2
সুন্দরভাবে সম্পন্ন. এটি সম্ভবত গ্রহণযোগ্য উত্তর হওয়া উচিত।
শন আব্রামসন

এটি সবসময় সমাধান না বলে মনে হয়। আমার ক্ষেত্রে আমি রিডিস (এখনও) ব্যবহার করি না
অ্যালেক্স

ধন্যবাদ। আমি বার্নিশ পুনরায় শুরু করেছি, এটি ভেবে যে এটি প্রবাহিত হবে, তবে এটি কৌশলটি করেছে।
ladle3000

এটি আমার পক্ষে কাজ করে
জারেড চু

এটি আমাকে ২.২.৯ থেকে ২.৩.২ এ উন্নীত করার সময় সহায়তা করেছিল। আমি পিএইচপি বিন / ম্যাজেন্টো সেটআপ
মোহাম্মদ জোড়াইদ

30

সমস্যাটি / vendor/magento/framework/Serialize/Serializer/Json.php এর মধ্যে রয়েছে একটি ফাংশন আনসিরিয়ালাইজ ($ স্ট্রিং) রয়েছে যা স্ট্রিং সিরিয়ালাইজড (জসন নয় পিএইচপি সিরিয়ালাইজেশন) হয়ে থাকলে আপনাকে একটি সিনট্যাক্স ত্রুটি দেয়।

একটি কার্যকারিতা রয়েছে - আপনি স্ট্রিংটি সিরিয়ালযুক্ত করা হয়েছে কিনা তা পরীক্ষা করতে পারেন (বনাম জসন-এনকোডেড) এবং তারপরে সিরিয়ালাইজ ($ স্ট্রিং) ব্যবহার করতে পারেন। আনসিরিয়ালে পরিবর্তন করুন:

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;
}

ফে বাঁচানোর পরে। সমস্যা ছাড়াই বিভাগ, আপনি ক্লাসটি ডিফল্টে পুনরুদ্ধার করতে পারেন এবং ভবিষ্যতে এ জাতীয় সমস্যা হবে না।


1
এটা আমার জন্য 100% জরিমানা। অনেক ধন্যবাদ!
ম্যাপলাদিয়া

2
এটি কাজ করছে না ... :-(
আরফান মির্জা

মান a: 0: {} পাস হলে কী হয় তা পরীক্ষা করে দেখুন। এক এক করে লাইনে যান। যদি আনসিরিয়ালাইজের ফলাফলটি একটি শক্তিশালী টাইপ করা পদ্ধতিতে পাস করা হয় যা অ্যারের প্রত্যাশা করে? আপনি আপনার উত্তর পরিবর্তন করতে চাইতে পারেন।
ভিটোরিওডেফ

20

সমাধানের জন্য মূল ফাইলগুলি সম্পাদনা করবেন না। নিম্নলিখিত ডিরেক্টরিটিকে ওভাররাইড করুন ডাই এক্সএক্সএমএল ইত্যাদি ডিরেক্টরিতে কেবল নিম্নলিখিত লাইনটি রেখে দিন

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

এবং নেমস্পেসের ভিতরে \ মডিউল নাম \ সিরিয়ালাইজ \ সিরিয়ালাইজার ডিরেক্টরি: ফাইল জসন.এফপি

<?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: {J জসনকে পাস করা হলে কী হবে: আনসিরিয়াল পদ্ধতি? এটা কি কাঙ্ক্ষিত আচরণ? Is_serialized পদ্ধতিতে ফলাফলের পরিবর্তনশীলটির বিন্দুটি কী? এটি ফেরত আসেনি এবং এটি কোনও কলমের উপর প্রভাব ফেলবে না কারণ পদ্ধতি কল হিসাবে কোনও ভেরিয়েবল দ্বিতীয় যুক্তিরূপ হিসাবে পাস হয় না।
ভিটোরিওডেফ

এটি গ্রহণযোগ্য সমাধান হওয়া উচিত, এবং সরাসরি বিক্রেতাতে ফাইল সম্পাদনা করতে উপরের পোস্টের চেয়ে অনেক ভাল much সম্ভাব্যতার চেয়ে বেশি, আপনাকে স্থানীয়ভাবে সেটআপ আপগ্রেড টাস্কটি চালাতে হবে এবং তারপরে আবার স্টেজিং / প্রোডাকশন চালিয়ে যেতে হবে, সুতরাং এটি পরিবেশ বজায় রাখতে হবে এবং বিক্রেতার / ডিরেক্টরিটি নির্মাণের সময় তৈরি একটি নিদর্শন।
মার্ক শস্ট

@ ভাইটোরিওডেফ আপনি উল্লিখিত হুবহু মামলার মুখোমুখি হচ্ছেন। আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
নাইট017

আমি বেসরকারী ফাংশনটি শেরিলাইজড ($ মান) {রিটার্ন (বুলিয়ান) প্রিগ_ম্যাচ ('/ ^ ((s | i | d | b | a | O | C):: N;) /', decide মান
নাইট017

কাজ করিনি আমি নিজে থেকে ডিবি সমস্ত এন্ট্রি পরিবর্তন করতে হয়েছিল a:0:{}করার[]
স্থানীয় হোস্ট

16

আমার ক্ষেত্রে, আমি সিরিয়ালযুক্ত স্ট্রিংটি আনসিরিয়ালাইজ করার জন্য নীচের মতো প্যাচ করেছি: ফাইল: / ভেন্ডর / ম্যাসেঞ্জো / ফ্রেমওয়ার্ক / সিরিয়ালাইজ / সিরিয়ালাইজার / জসন.ফ্প

খুঁজুন:

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
ধন্যবাদ @ ম্যাজলিয়ার্নার, এটি ম্যাজেন্টো 1 থেকে ম্যাজেন্টো 2
প্রদীপ ঠাকুর

5

রেডিস ফ্লাশ করার পরে সমস্যাটি সাজানো হয়েছে। ধন্যবাদ ক্রেগ সমাধানের জন্য।

আমি ক্যাশের জন্য 79৩79৯ বন্দর ব্যবহার করছি, সুতরাং আমি কমান্ড চালাচ্ছি:

redis-cli -p 6379 flushall

4

এটি বেশিরভাগই রেডিস ক্যাশে সম্পর্কিত, সুতরাং আপনার এসএসএইচে সাধারণ কমান্ডের সাহায্যে এটি বের করার চেষ্টা করুন

redis-cli flushall


3

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

সার্ভারের জন্য উপযুক্ত উমাস্কের সাহায্যে রুট ডিরেক্টরিতে 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

২. নিচের ফাংশনটি (unserialize) কেবল প্রতিস্থাপন করুন এবং নতুন ফাংশন যুক্ত করুন বা কেবল সংযুক্ত ফাইলটি ডাউনলোড করুন এবং ডিফল্ট দিয়ে প্রতিস্থাপন করুন

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)
{

    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

আমি সামনের প্রান্তে একটি সিএমএস পৃষ্ঠায় ত্রুটি পাচ্ছিলাম।

এটি সিএমএস পৃষ্ঠা বিষয়বস্তুতে ম্যাজেন্টো উইজেট কোড যা সমস্যার সৃষ্টি করে (যা আমি অন্য উত্স থেকে অনুলিপি করেছি)। আমি উইজেট কোডটি মুছে ফেলেছি এবং সিএমএস পৃষ্ঠা সম্পাদনা স্ক্রিনে সন্নিবেশ উইজেট বোতামটি ব্যবহার করে একই উইজেটটি sertedোকিয়েছি এবং এটি কার্যকর হয়েছে।

উপরের প্রক্রিয়াটি উইজেট কোডটিকে আলাদাভাবে ফর্ম্যাট করেছে এবং এটি ত্রুটিটি দূরে সরিয়ে দিয়েছে।


0

আমি খুঁজে পেয়েছি যে পুরো সিরিয়ালযুক্ত ডেটা TEXTডেটা টাইপের সাথে একটি ডাটাবেস মাইএসকিউএল টেবিল কলামে ফিট করা যায় না ।
আমি সবেমাত্র কলামটির flag_dataমান খুঁজে পেয়েছিsystem_config_snapshot লাইনের ছাঁটাই ।

MEDIUMTEXTএই কলামটির জন্য আমাকে এটিতে পরিবর্তন করতে হয়েছিল flag.flag_data


0

একই ত্রুটি ছিল। তাজা কোড (ভেরি ২.৩.২) সহ ডাটাবেস (ভেরি ২.২..6) আপডেট করার চেষ্টা করার সময়।

স্থির জন্য - চালানো

composer update

0

এটি সরাসরি স্কুয়েল চালানোর সেরা উপায় নয় তবে আমি আমার সময় বাঁচানোর জন্য এটি করেছি। শুধু এই কোয়েরি চালান

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

আপনি যদি ২.৩.০ বা তার বেশি হন তবে আপনি ম্যাজলিয়ারার দ্বারা সরবরাহিত সমাধানটি ব্যবহার করতে চাইবেন। কেস স্টেটমেন্ট সহ পুরানো উপায় অপ্রচলিত। যদি আপনি ২.৩.০ বা তার বেশি ক্ষেত্রে ম্যাগলিয়ারের সমাধানটি ব্যবহার না করেন; অর্ডার ডেটা এবং কনফিগারযোগ্য পণ্যগুলি দেখার ক্ষেত্রে আপনি সমস্ত ধরণের সমস্যার মুখোমুখি হবেন।

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