Magento 2.2.1 Değer serileştirilemiyor


12

Web sitesini 2.1.6'dan 2.2.1'e yükselttim ve ön uç ve arka uçta değer hatası serileştirilemiyor.

{"0":"Unable to serialize value.","1":"#0 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Translate.php(494): Magento\\Framework\\Serialize\\Serializer\\Json->serialize(Array)\n
#1 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Translate.php(190): Magento\\Framework\\Translate->_saveCache()\n
#2 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Area.php(244): Magento\\Framework\\Translate->loadData(NULL, false)\n
#3 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Area.php(215): Magento\\Framework\\App\\Area->_initTranslate()\n
#4 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Area.php(142): Magento\\Framework\\App\\Area->_loadPart('translate')\n
#5 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/View\/DesignLoader.php(55): Magento\\Framework\\App\\Area->load('translate')\n
#6 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Action\/Plugin\/Design.php(48): Magento\\Framework\\View\\DesignLoader->load()\n
#7 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(121): Magento\\Framework\\App\\Action\\Plugin\\Design->beforeDispatch(Object(Magento\\Cms\\Controller\\Index\\Index\\Interceptor), Object(Magento\\Framework\\App\\Request\\Http))\n
#8 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\\Cms\\Controller\\Index\\Index\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#9 \/var\/www\/vhosts\/demo.com\/eiselec\/generated\/code\/Magento\/Cms\/Controller\/Index\/Index\/Interceptor.php(39): Magento\\Cms\\Controller\\Index\\Index\\Interceptor->___callPlugins('dispatch', Array, Array)\n
#10 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/FrontController.php(55): Magento\\Cms\\Controller\\Index\\Index\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n
#11 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(58): Magento\\Framework\\App\\FrontController->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n
#12 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(138): Magento\\Framework\\App\\FrontController\\Interceptor->___callParent('dispatch', Array)\n
#13 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/module-store\/App\/FrontController\/Plugin\/RequestPreprocessor.php(94): Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#14 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(135): Magento\\Store\\App\\FrontController\\Plugin\\RequestPreprocessor->aroundDispatch(Object(Magento\\Framework\\App\\FrontController\\Interceptor), Object(Closure), Object(Magento\\Framework\\App\\Request\\Http))\n
#15 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/module-page-cache\/Model\/App\/FrontController\/BuiltinPlugin.php(73): Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#16 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(135): Magento\\PageCache\\Model\\App\\FrontController\\BuiltinPlugin->aroundDispatch(Object(Magento\\Framework\\App\\FrontController\\Interceptor), Object(Closure), Object(Magento\\Framework\\App\\Request\\Http))\n
#17 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#18 \/var\/www\/vhosts\/demo.com\/eiselec\/generated\/code\/Magento\/Framework\/App\/FrontController\/Interceptor.php(26): Magento\\Framework\\App\\FrontController\\Interceptor->___callPlugins('dispatch', Array, NULL)\n
#19 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Http.php(135): Magento\\Framework\\App\\FrontController\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n
#20 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Bootstrap.php(256): Magento\\Framework\\App\\Http->launch()\n
#21 \/var\/www\/vhosts\/demo.com\/eiselec\/index.php(39): Magento\\Framework\\App\\Bootstrap->run(Object(Magento\\Framework\\App\\Http))\n
#22 {main}","url":"\/","script_name":"\/index.php"}

Bunu nasıl çözebileceğimi bana bildirin.

Teşekkürler


Merhaba, ben serileştirmek değeri değersizleşmek değerinden bahsediyorum.
Meetanshi

Önbelleği temizlemeyi denediniz mi? sadece Magento önbellek değil, harici önbellekler de varsa.
MGento

evet, denedim.
Meetanshi

Hangi verileri serileştirmeye çalıştığınızı öğrenmeye çalışabilir misiniz? Üçüncü taraf modülleriniz arasında geçiş yapmayı deneyin ve bu hatanın hangi modülden tetiklendiğini öğrenin. Muhtemelen /vendor/magento/framework/Serialize/Serializer/Json.php dosyasında serileştirme işlevini geçersiz kılmanız gerekebilir
MGento

DB hatası sırasında veya DB'yi 2.2.1'e güncelledikten sonra bu hata mı oluyor?
24:17

Yanıtlar:


4

bir şablonla aynı davranışa sahip. Sorunumu almak için hata kodunu serileştiricime kopyaladım.

En kısa sürede de_DE geçmek ve statik kodumu üzerinden yeniden

sudo php bin/magento setup:static-content:deploy de_DE --jobs=0 -f

"Hatalı kodlanmış hatalı biçimlendirilmiş UTF-8 karakterleri" atar.

Böylece şablon klasöründe (yani kod / Mytheme / Bannerslider / i18n / de_DE.csv) değiştirdiğim dosyaları aradım ve onları WinSCP ile indirdim. Notepad ++ "Ansii Kodlama" gösterdi - zor ben çeviri dosyası oluşturmak için "magento i18n: toplamak-ifadeler" kullanılır.

magento2dev # encguess app/code/MyTheme/Bannerslider/i18n/de_DE.csv

app / code / MyTheme / Bannerslider / i18n / de_DE.csv US-ASCII

magento2dev # locale
LANG=de_DE.UTF-8
......

Bu yüzden dosyaları Notepad ++ ile manuel olarak değiştirdim, yükledim, statik içeriği dağıttı ve tüm izinleri sıfırladı - en voila çalışıyor.

Yani, hata i18n csv dosyanızda olabilir.


10

Gördüğüm gibi bu hata yöntemden geliyor:

/**
 * Saving data cache
 *
 * @return $this
 */
protected function _saveCache()
{
    $this->_cache->save($this->getSerializer()->serialize($this->getData()), $this->getCacheId(true), [], false);
    return $this;
}

ve bulunmayan serileştirici yöntemden gelir:

/**
 * Get serializer
 *
 * @return \Magento\Framework\Serialize\SerializerInterface
 * @deprecated 100.2.0
 */
private function getSerializer()
{
    if ($this->serializer === null) {
        $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
            ->get(Serialize\SerializerInterface::class);
    }
    return $this->serializer;
}

SerializerInterfaceMagento'nun 2.2.x sürümünden beri tercih edildi ve / etc / di.xml uygulamasında bildirildi :

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

Bu yüzden önbelleğinizin eski olduğunu veya tercihinin SerializerInterfaceçalışmadığını düşünüyorum. Kodda bir yere Magento\Framework\Serialize\SerializerInterface(bağımlılık enjeksiyonunu kullanarak) çağırarak bu sorunu gidermeye çalışın ve hangi sınıfın di tarafından döndürüldüğünü kontrol edin:

public function __construct(\Magento\Framework\Serialize\SerializerInterface $serializer) 
{ 
    echo get_class($serializer);
}

Magento\Framework\Serialize\Serializer\JsonDöndürülen sınıfın bir örneğini döndürmezse, bu üzerine yazılan tercihi projede aramayı ve kaldırmayı deneyin.

Uzak sunucu üzerinde çalışıyorsanız - önce app/etc/di.xmldosyayı doğrudan sunucuda kontrol edin .

Çekirdek Jsonserileştiriciyi geçici olarak değiştirmenin ve hangi hatanın döndüğünü kontrol etmenin başka bir yolu :

magento/framework/Serialize/Serializer/Json.phpBu yöntemi açın ve şu yöntemden değiştirin:

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

için:

/**
 * {@inheritDoc}
 * @since 100.2.0
 */
public function serialize($data)
{
    $result = json_encode($data);
    if (false === $result) {
        switch (json_last_error()) {
            case JSON_ERROR_NONE:
                $error = ' - No errors';
                break;
            case JSON_ERROR_DEPTH:
                $error = ' - Maximum stack depth exceeded';
                break;
            case JSON_ERROR_STATE_MISMATCH:
                $error = ' - Underflow or the modes mismatch';
                break;
            case JSON_ERROR_CTRL_CHAR:
                $error = ' - Unexpected control character found';
                break;
            case JSON_ERROR_SYNTAX:
                $error = ' - Syntax error, malformed JSON';
                break;
            case JSON_ERROR_UTF8:
                $error = ' - Malformed UTF-8 characters, possibly incorrectly encoded';
                break;
            default:
                $error = ' - Unknown error';
                break;
        }
        throw new \InvalidArgumentException('Unable to serialize value. Error: ' . $error);
    }

    return $result;
}

Sonra istisna mesajdan sonra bir json hatası görebilirsiniz. Verileriniz bozuk olabilir. magento güncelleme sırasında kurulum yükseltme komut dosyalarında json kullanılarak tüm eski verilerin serileştirilmemesi ve serileştirilmesi gerektiğini unutmayın.

Not: hata ayıklama tamamlandıktan sonra temel dosyaları geri almayı unutmayın! Daha iyi bir yol bu amaç için xDebug kullanmaktır.


2
Bu hata ayıklayıcı yardımcısını çekirdek bir yama haline getirmelisiniz - ya da SAFE PHP kullanmasını önermelisiniz github.com/thecodingmachine/safe
Alex

2

Benim durumumda UTF8 Kodlama sorununun nedeni, ürün adlarında çok baytlı güvenli olmayan kısaltma oldu:

$productName = strlen($productName) > 60 ? substr($productName,0,60)."..." : 
      $productName;

Yani bir

012345678901234567890123456789012345678901234567890123456 Außengewinde 

oldu

012345678901234567890123456789012345678901234567890123456 Au�...

Bu bizim için de bir konuydu. ixed "substr" yerine "mb_substr" ile değiştirerek
amesh

Tıkır tıkır çalışıyor!!!
Bharat Sevra

2

Substr işlevine dikkat edin. UTF-8'i desteklemez. Ve bu FPC'yi kırabilir. Mb_substr kullanın


1

2.2.1 sürümüne yükseltme ile aynı sorunu yaşadım. Bu makarnayı çok faydalı buldum http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

DB'de depolanan veriler artık serileştirilmemelidir, şimdi bir JSON nesnesi olarak kaydedilmelidir.

Çoğu modül, DB'deki verilerin serileştirilmesini kaldıran ve bir JSON biçimi altında tekrar depolayan bir veri güncellemesi yapar. (BTW Bunu çalıştırmak biraz zaman aldı ...)

Bu nedenle, modüllerinizden biri DB'de serileştirilmiş verileri artık Magento tarafından okunamayabileceği şekilde kaydederse, veri yükseltme Kurulum dosyası yapmanız gerekir. Ayrıca, 2.2'den fazla uyumlu bir sürüme güncellenmesi gereken 3. taraf bir modül olabilir.

Kodunuzun herhangi bir yerindeki diziselleştirilmemiş verileri seri hale getirirseniz, bunu değiştirmeniz de gerekebilir.

Umarım bu size bu hataya neyin neden olduğu hakkında daha iyi bir fikir verir.

Şerefe!


2.2.1 Sürüm Notlarını okuduğunuzdan emin olun, generationklasör yolu da dahil olmak üzere çok şey değişti . ;)
drew7721

1

Aynı duruma geldim. Yukarıdaki kodu ekledikten sonra "Hatalı kodlanmış hatalı biçimlendirilmiş UTF-8 karakterleri" aldım

Sanırım varsayılan dili kullanmıyorsunuz. Dili "varsayılan" olarak değiştirmeyi deneyin en_US.

Meetanshi - Ön uçta hangi dili kullanıyorsunuz ve statik içerik oluşturma da başarısız oluyor?


Merhaba @AP, aynı hatayla karşılaşıyorum ve de_DE dilini kullanıyorum.
Meetanshi

En_US olarak değiştirmeyi deneyin. Tablo core_config_data (genel / yerel / kod) - en_US
AP

en_US olarak değiştirdikten sonra aynı hata.
Meetanshi

Uyandırmayı başardım, ama fi_FI'ye geri dönmeye çalışırken çıkmaz sokak. Önbelleği temizlediniz mi?
AP

evet, önbelleği temizledim
Meetanshi

0

Benim için çözüm, çeviri csv dosyasındaki "ä" gibi tüm özel karakterleri, bunun gibi aynı karakterdeki html sürümleriyle değiştirmekti:

&auml;

Sonra önbellekleri temizledim ve ön ucu yeniden yükledim.

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.