Magento 2.2: Değeri seri hale getiremiyor musunuz?


33

Magento 2.2.0-rc3.0 / PHP 7.0.23 çalıştıran bir sitedeki konulara girme

Aşağıdaki sorun, tüm 3. taraf uzantılarında etkin veya devre dışı bırakılmış durumlarla oluşur.

Kategori veya ürün sayfasından karşılaştırmaya bir öğe eklerken veya ürün sayfasından bir inceleme gönderirken, tarayıcıda aşağıdaki hatayı alıyoruz:

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}

Çerezleri, özellikle mage mesajları çerezini silmediğiniz sürece hata kaybolmaz. görüntü tanımını buraya girin

Bu hataları gidermek için herhangi bir yardım takdir edilmektedir.


Bu çekirdek bir böcek değil mi? Bunun için GitHub sorunu var mı?
Alex

Bu size bir fikir verecektir scommerce-mage.com/blog/…
stevensagaar

Yanıtlar:


59

Redis Önbelleğimi CLI'den Yıkama ile bu sorunu çözebildim

redis-cli flushall

Umarım bu gelecekteki kullanıcılara yardımcı olur.


2
Güzel bitti. Bu muhtemelen kabul edilen cevap olmalıdır.
Shawn Abramson

Her zaman çözüm gibi görünmüyor. Benim durumumda redis bile kullanmıyorum (henüz)
Alex

Teşekkürler. cilalanmaya başladım, bunu temizleyeceğini düşünmüştüm, ama bu işe yaradı.
Kepçe3000

benim için çalışıyor
Jared Chu

Bu, 2.2.9'dan 2.3.2'ye yükseltirken bana yardımcı oldu. Php bin / magento kurulumunu
Mohammed Joraid

30

Sorun / satıcısı /magento/framework/Serialize/Serializer/Json.php içinde dize serileştirilmişse (json değil php serileştirme) size bir sözdizimi hatası veren bir dizileşmeyen ($ string) işlev var.

Bir geçici çözüm var - dizginin serileştirilip denetlenmediğini (vs json kodlu) kontrol edebilir ve ardından serileştirmeyi ($ string) kullanabilirsiniz. Serileştirmeyi şuna değiştir:

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

ve dize serileştirilmiş olup olmadığını kontrol etmek için işlev ekleyin:

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 kaydettikten sonra. Sorunsuz kategori, sınıfı varsayılana geri yükleyebilirsiniz ve gelecekte böyle bir sorun olmayacak.


1
Benim için% 100 iyi çalışıyor. Çok teşekkürler!
mapaladiya

2
çalışmıyor ... :-(
Arfan Mirza

A: 0: {} değeri geçilirse ne olacağını kontrol edin. Satır satır gidin. Serileştirmenin sonucu bir dizi bekleyen güçlü bir yazılı yönteme geçirilirse ne olur? Cevabınızı değiştirmek isteyebilirsiniz.
vitoriodachef

20

Çözüm için çekirdek dosyaları düzenlemeyin. Aşağıdaki yolu geçersiz kıl. Sadece şu satırı di.xml'e etc dizinine koy.

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

Ve Namespace \ ModuleName \ Serialize \ Serializer Directory içinde: dosya 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;
    }
}

Mükemmel çalışıyor


2
Uygulama hatalı. A: 0: {} değeri Json: unserialize metoduna iletilirse ne olur? İstenilen davranış mı? İs_serialized yönteminde sonuç değişkeninin noktası nedir? İade edilmedi ve yöntem çağrısında hiçbir değişken ikinci argüman olarak geçirilmediğinden hiçbir şey üzerinde etkisi yok.
vitoriodachef

Bu kabul edilen çözüm olmalıdır ve dosyayı doğrudan satıcıda düzenlemek için yukarıdaki gönderiden çok daha iyidir. Büyük olasılıkla, kurulum yükseltme görevini yerel olarak çalıştırmanız ve ardından tekrar sahneleme / prodüksiyon sırasında kullanmak zorundasınız, bu nedenle ortamları sürdürmek zorunda kalacak ve satıcı / dizin derleme sırasında oluşturulan bir yapıdır.
Mark Shust,

@ vitoriodachef Bahsettiğiniz dava ile yüzleşiyorum. Herhangi bir çözüm buldunuz mu?
Knight017

Özel işleve
Knight017 20:18

İşe yaramadı. El ile gelen DB tüm girişleri değiştirmek zorunda a:0:{}için[]
localhost

16

Benim durumumda, serileştirilmiş bir dizgeyi dizileştirmek için şu şekilde yama yaptım: Dosya: /vendor/magento/framework/Serialize/Serializer/Json.php

bul:

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

ile değiştir:

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

Bunu denedim ama beklendiği gibi çalışmıyor. Bunu deneyen var mı ve işe
yaradıysa

Hangi sorunlarla karşı karşıya kaldın?
MageLearner

Sorun çözüldü. Sorduğunuz için teşekkürler!
Siva

1
Grt ... Teşekkürler !!!
MageLearner

1
Thanks @MageLearner, Magento 1'den magento 2'ye veri aktarıldıktan sonra 2.3.1'de de çalışıyor
Pradeep Thakur

5

Redis'i yıkadıktan sonra sorun çözüldü. Çözüm için teşekkür ederim Craig .

Önbellek için 6379 numaralı bağlantı noktasını kullanıyorum, bu nedenle komutu çalıştırıyorum:

redis-cli -p 6379 flushall

4

Çoğunlukla Redis önbelleği ile ilgilidir, bu yüzden SSH'nizde basit komutla bunu temizlemeye çalışın

redis-cli flushall


3

Magento'nun bu sunucuda kısıtlı olarak oluşturulan dosyalar için izinleri ayarladığı bir izin sorunu olduğu ortaya çıktı.

Sunucu için uygun umask ile kök dizinde magento_umask dosyası oluşturarak çözüldü.

Bkz http://devdocs.magento.com/guides/v2.2/install-gde/install/post-install-umask.html ek ayrıntılar için.


Merhaba, Ben böyle bir konuyla karşı karşıyayım. Size bakmak misiniz bu .
Aditya Shah,

@ chunk tüm dir 755 ve dosyalar 644, ayarlanacak uygun umask nedir? tia
Kris Wen

2

Yukarıdaki bloğun cevabı benim için çalıştı ancak blokta farklı kodlar kullanmak zorunda kaldım.

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

Kök dizini 1. public_html/vendor/magento/framework/Serialize/Serializer/Json.php

İndir JSON.php https://gist.github.com/manojind/9f18bbecaeb3e2bbfb056a634ade62a2

2. Sadece aşağıdaki işlevi değiştirin (seri hale getirin) ve yeni bir işlev ekleyin VEYA ekli dosyayı indirin ve varsayılan ile değiştirin

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. Yeni fonksiyon ekle:

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

Sorunum çözülmedi ... lütfen bana yardım edin
Muhammad Ahmed

1

Ben şahsen bu konuyu çalıştırdım komutunu çalıştıran başı oldu:

php bin/magento setup:upgrade

Bir göçten sonra. İçinde " crypt " hash anahtarının eksik olduğunu öğrendim src/app/etc/env.php:

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

    ...

Bunun boş olmadığından ve tercihen projelerinizin diğer ortamlarıyla eşleştiğinden emin olun!


Yeni bir tane üretmeyi beklerken kurulum sırasında şifreli anahtarı boş bıraktım.
Shapeshifter

0

Ön uçtaki bir CMS sayfasındaki hatayı alıyordum.

CMS Sayfa İçeriğindeki, soruna neden olan Magento widget koduydu (başka bir kaynaktan kopyaladım). Widget kodunu sildim ve aynı widget'ı CMS Sayfası düzenleme ekranında Widget Ekle düğmesini kullanarak ekledim ve çalıştı.

Yukarıdaki işlem, widget kodunu farklı biçimlendirdi ve hatayı uzaklaştırdı.


0

Serileştirilmiş verilerin tamamının TEXTveri türüne sahip bir veritabanı MySQL tablo sütununa sığmayacağını öğrendim . Satır
sütununun flag_datadeğerinin system_config_snapshotkırpıldığını gördüm .

MEDIUMTEXTBu sütun için onu değiştirmek zorunda kaldım flag.flag_data.


0

Aynı hataydı. Veritabanını (ver 2.2.6) yeni kodla (ver 2.3.2) güncellemeye çalıştığınızda.

Düzeltmek için - runned

composer update

0

Bu doğrudan sql çalıştırmak için en iyi yol değil ama zaman kazanmak için yaptım. Sadece bu sorguyu çalıştır

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 veya daha üstündeyseniz, MageLearner tarafından sağlanan çözümü kullanmak isteyeceksiniz. Vaka ifadeleri ile eski yolu modası geçmiş. MageLearner'ın çözümünü 2.3.0 veya daha yüksek sürümlerde kullanmazsanız; Sipariş verilerini ve konfigüre edilebilir ürünleri görüntülemeyle ilgili her türlü soruna çarpacaksınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.