Magento 2.2.1 Wert kann nicht serialisiert werden

12

Ich habe die Website von 2.1.6 auf 2.2.1 aktualisiert und kann den Wertfehler im Frontend und Backend nicht serialisieren.

{"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"}

Lassen Sie mich wissen, wie ich es lösen kann.

Vielen Dank

Meetanshi
quelle
Hallo, ich spreche von Serialisierungswert und nicht von unseremiaize Wert.
Meetanshi
Haben Sie versucht, den Cache zu leeren? Nicht nur Magento-Cache, sondern auch externe Caches.
MGento
Ja, ich habe es versucht.
Meetanshi
Können Sie versuchen herauszufinden, welche Daten Sie serialisieren möchten? Versuchen Sie, Ihre Module von Drittanbietern zu durchlaufen, und finden Sie heraus, von welchem ​​Modul dieser Fehler ausgelöst wird. Möglicherweise müssen Sie die Serialisierungsfunktion in der Datei /vendor/magento/framework/Serialize/Serializer/Json.php
MGento
Tritt dieser Fehler während des DB-Updates auf oder nachdem Sie den DB auf 2.2.1 aktualisiert haben?
zog7721

Antworten:

4

Ich habe das gleiche Verhalten mit einer Vorlage. Ich habe den Code für den Fehler in meinen Serializer kopiert, um mein Problem zu beheben.

Sobald ich zu de_DE wechsle und meinen statischen Code über neu generiere

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

Es wird "Fehlgebildete UTF-8-Zeichen, möglicherweise falsch codiert" ausgegeben.

Also habe ich die Dateien, die ich geändert habe, im Vorlagenordner (dh Code / Mytheme / Bannerslider / i18n / de_DE.csv) nachgeschlagen und über WinSCP heruntergeladen. Notepad ++ zeigte "Ansii Encoding" - schwer, ich habe "magento i18n: collect-phrases" für die zu erstellende Übersetzungsdatei verwendet.

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
......

Also habe ich die Dateien manuell in Notepad ++ geändert, sie hochgeladen, den statischen Inhalt bereitgestellt und alle Berechtigungen zurückgesetzt - en voila es funktioniert.

Der Fehler könnte sich also in Ihrer i18n-CSV-Datei befinden.

Lord_Pinhead
quelle
10

Wie ich sehen kann, kommt dieser Fehler von der Methode:

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

und Serializer, der nicht gefunden wird, stammt von der Methode:

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

Die Präferenz für das SerializerInterfacewurde seit der 2.2.x-Version von Magento hinzugefügt und in der App / etc / di.xml deklariert :

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

Ich denke, Ihr Cache ist alt oder die Präferenz für SerializerInterfacefunktioniert nicht. Versuchen Sie, dieses Problem zu beheben, indem Sie Magento\Framework\Serialize\SerializerInterfaceirgendwo im Code die (mithilfe der Abhängigkeitsinjektion) aufrufen und überprüfen, welche Klasse von di zurückgegeben wird:

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

Wenn keine Instanz der zurückgegebenen Magento\Framework\Serialize\Serializer\JsonKlasse zurückgegeben wird, versuchen Sie, diese überschriebene Voreinstellung im Projekt zu durchsuchen und zu entfernen.

Wenn Sie auf dem Remote-Server arbeiten, überprüfen Sie zunächst die app/etc/di.xmlDatei auf dem Server direkt.

Eine andere Möglichkeit, den Core JsonSerializer vorübergehend zu ändern und zu überprüfen, welcher Fehler zurückgegeben wurde:

Öffnen Sie die magento/framework/Serialize/Serializer/Json.phpund ändern Sie diese Methode von:

/**
 * {@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;
}

zu:

/**
 * {@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;
}

Dann können Sie nach der Ausnahmemeldung einen JSON-Fehler sehen. Möglicherweise sind Ihre Daten fehlerhaft. Beachten Sie, dass alle alten Daten während des Magento-Updates mit json in den Setup-Upgrade-Skripten unserialisiert und serialisiert werden sollten.

PS: Vergessen Sie nicht, die Kerndateien nach Abschluss des Debuggens zurückzusetzen! Der bessere Weg ist, xDebug für diesen Zweck zu verwenden.

Siarhey Uchukhlebau
quelle
2
Sie sollten diesen Debugger-Helfer zu einem Kern-Patch machen - oder vorschlagen, dass sie SAFE PHP verwenden. Github.com/thecodingmachine/safe
Alex
1

Ich habe das gleiche Problem mit dem Upgrade auf 2.2.1 ausgeführt. Ich fand diesen Artikel sehr hilfreich http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

In der Datenbank gespeicherte Daten sollten nicht mehr serialisiert werden, sondern jetzt als JSON-Objekt gespeichert werden.

Die meisten Module führen eine Datenaktualisierung durch, bei der die Daten in der Datenbank unserialisiert und erneut im JSON-Format gespeichert werden. (Übrigens hat es eine ganze Weile gedauert, dies auszuführen ...)

Wenn eines Ihrer Module Daten speichert, die in der Datenbank serialisiert sind und möglicherweise nicht mehr von Magento gelesen werden können, müssen Sie eine Setup-Datei für die Datenaktualisierung erstellen. Möglicherweise handelt es sich auch um ein Modul eines Drittanbieters, das auf eine mit 2.2+ kompatible Version aktualisiert werden muss.

Wenn Sie Daten irgendwo in Ihrem Code auf unserialisieren, müssen Sie dies möglicherweise auch ändern.

Ich hoffe, dies gibt Ihnen einen besseren Einblick in die Ursachen dieses Fehlers.

Prost!

zog7721
quelle
Lesen Sie unbedingt die Versionshinweise für 2.2.1. Die Lose haben sich geändert, einschließlich des Pfads für den generationOrdner. ;)
zog7721
1

Ich bin genau in die gleiche Situation geraten. Nachdem ich den obigen Code hinzugefügt hatte, erhielt ich "Fehlerhafte UTF-8-Zeichen, möglicherweise falsch codiert".

Ich nehme an, dass Sie nicht die Standardsprache verwenden. Versuchen Sie, die Sprache auf "Standard" en_US zu ändern.

Meetanshi - Welche Sprache verwenden Sie im Front-End und schlägt auch die Erstellung statischer Inhalte fehl?

AP
quelle
Hallo @AP, ich habe den gleichen Fehler und verwende die Sprache de_DE.
Meetanshi
Versuchen Sie, zu en_US zu wechseln. Tabelle core_config_data (general / locale / code) zu en_US
AP
gleicher Fehler nach dem Wechsel zu en_US.
Meetanshi
Ich habe es geschafft, aber Sackgasse, als ich versuchte, zu fi_FI zurückzukehren. Haben Sie den Cache geleert?
AP
Ja, ich habe den Cache
geleert
1

In meinem Fall war die Ursache für ein UTF8-Codierungsproblem eine nicht multibyte sichere Verkürzung der Produktnamen:

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

Also a

012345678901234567890123456789012345678901234567890123456 Außengewinde 

wurde

012345678901234567890123456789012345678901234567890123456 Au�...
Alex
quelle
Dies war auch das Problem für unsere. Ich habe es behoben, indem ich "substr" durch "mb_substr" ersetzt habe
amesh
1

Seien Sie vorsichtig mit der Substr-Funktion. UTF-8 wird nicht unterstützt. Und das kann die FPC brechen. Verwenden Sie mb_substr

Arni
quelle
0

Für mich bestand die Lösung darin, alle Sonderzeichen wie "ä" in der CSV-Übersetzungsdatei durch HTML-Versionen desselben Zeichens wie folgt zu ersetzen:

&auml;

Dann habe ich die Caches geleert und das Frontend neu geladen.

Webninja
quelle