Magento 2.2.1 ไม่สามารถทำให้เป็นอนุกรมมูลค่า


12

ฉันได้อัปเกรดเว็บไซต์จาก 2.1.6 เป็น 2.2.1 และหันหน้าไปทางไม่สามารถทำให้เกิดข้อผิดพลาดค่าต่อเนื่องในส่วนหน้าและส่วนหลัง

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

แจ้งให้เราทราบว่าฉันจะแก้ไขได้อย่างไร

ขอบคุณ


สวัสดีฉันกำลังพูดถึงมูลค่าเป็นอันดับไม่ใช่ค่า unseriaize
Meetanshi

คุณลองล้างแคชแล้วหรือยัง ไม่เฉพาะแคชของวีโอไอพีเท่านั้น แต่ยังมีแคชภายนอกอีกด้วย
MGento

ใช่ฉันได้ลองแล้ว
Meetanshi

คุณลองหาดูว่าข้อมูลอะไรที่คุณพยายามทำให้เป็นอันดับ? ลองสำรวจผ่านโมดูลบุคคลที่สามของคุณและค้นหาว่าโมดูลใดมีข้อผิดพลาดนี้เกิดขึ้น คุณอาจจำเป็นต้องแทนที่ฟังก์ชันอนุกรมในไฟล์ /vendor/magento/framework/Serialize/Serializer/Json.php
MGento

ข้อผิดพลาดนี้เกิดขึ้นในระหว่างการอัพเดทฐานข้อมูลหรือหลังจากที่คุณอัพเดตฐานข้อมูลเป็น 2.2.1
drew7721

คำตอบ:


4

ฉันมีพฤติกรรมเหมือนกันกับแม่แบบ ฉันคัดลอกรหัสสำหรับข้อผิดพลาดไปยัง serializer ของฉันเพื่อรับปัญหาของฉัน

ทันทีที่ฉันเปลี่ยนเป็น de_DE และสร้างรหัสคงที่ใหม่อีกครั้งผ่านทาง

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

มันจะโยน "อักขระ UTF-8 ที่มีรูปแบบไม่ถูกต้องอาจเข้ารหัสไม่ถูกต้อง"

ดังนั้นฉันค้นหาไฟล์ที่ฉันเปลี่ยนแปลงในโฟลเดอร์แม่แบบ (เช่นรหัส / Mytheme / Bannerslider / i18n / de_DE.csv) และดาวน์โหลดผ่าน WinSCP Notepad ++ แสดงให้เห็นว่า "การเข้ารหัส Ansii" - ยากที่ฉันใช้ "magento i18n: collect-phrase" สำหรับไฟล์การแปลที่จะสร้าง

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

แอพ / รหัส / MyTheme / Bannerslider / i18n / de_DE.csv US-ASCII

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

ดังนั้นฉันจึงเปลี่ยนไฟล์ด้วยตนเองใน Notepad ++ อัปโหลดปรับใช้เนื้อหาแบบคงที่และรีเซ็ตสิทธิ์ทั้งหมด - ในการใช้งาน

ดังนั้นข้อผิดพลาดอาจอยู่ในไฟล์ i18n csv ของคุณ


10

ที่ฉันเห็นข้อผิดพลาดนี้มาจากวิธีการ:

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

และ serializer ที่ไม่พบมาจากวิธีการ:

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

การตั้งค่าสำหรับการSerializerInterfaceเพิ่มตั้งแต่รุ่นวีโอไอพี 2.2.x และประกาศในapp / etc / di.xml :

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

ดังนั้นฉันคิดว่าแคชของคุณเก่าหรือการตั้งค่าสำหรับSerializerInterfaceไม่ทำงาน ลองแก้ไขปัญหานี้โดยโทรMagento\Framework\Serialize\SerializerInterface(ใช้การขึ้นต่อกันของผู้ใช้) ที่ใดที่หนึ่งในรหัสและตรวจสอบว่าคลาสใดที่ส่งคืนโดย di:

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

ถ้ามันส่งคืนไม่ใช่อินสแตนซ์ของ Magento\Framework\Serialize\Serializer\Jsonคลาสที่ส่งคืน - ลองค้นหาการตั้งค่าที่เขียนทับนี้ในโครงการและลบออก

หากคุณกำลังทำงานบนเซิร์ฟเวอร์ระยะไกล - ตรวจสอบapp/etc/di.xmlไฟล์บนเซิร์ฟเวอร์โดยตรงก่อน

อีกวิธีหนึ่งที่คุณสามารถปรับเปลี่ยนแกนJsonอนุกรมอนุกรมชั่วคราวและตรวจสอบข้อผิดพลาดที่ส่งคืน:

เปิดmagento/framework/Serialize/Serializer/Json.phpและเปลี่ยนวิธีนี้จาก:

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

ถึง:

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

จากนั้นคุณสามารถดูข้อความข้อผิดพลาดหลังจาก json อาจเป็นเพราะข้อมูลของคุณเสีย โปรดทราบว่าข้อมูลเก่าทั้งหมดควรถูกยกเลิกการบันทึกและจัดลำดับโดยใช้ json ในสคริปต์อัปเกรดการตั้งค่าระหว่างการอัปเดตวีโอไอพี

PS:อย่าลืมเปลี่ยนกลับไฟล์หลักหลังจากการดีบั๊กเสร็จสมบูรณ์! วิธีที่ดีกว่าคือใช้ xDebug เพื่อจุดประสงค์นั้น


2
คุณควรทำให้ debugger-helper เป็น patch หลัก - หรือแนะนำให้ใช้ SAFE PHP github.com/thecodingmachine/safe
Alex

2

ในกรณีของฉันสาเหตุของปัญหาการเข้ารหัส UTF8 ทำให้ชื่อผลิตภัณฑ์ไม่สั้นลงอย่างปลอดภัยแบบหลายไบต์:

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

ดังนั้น

012345678901234567890123456789012345678901234567890123456 Außengewinde 

กลายเป็น

012345678901234567890123456789012345678901234567890123456 Au�...

นี่เป็นปัญหาสำหรับเราด้วย ixed โดยการแทนที่ "substr" ด้วย "mb_substr"
amesh

ทำงานเหมือนจับใจ !!!
Bharat Sevra


1

ฉันพบปัญหาเดียวกันกับการอัพเกรดเป็น 2.2.1 ฉันพบบทความนี้จะมีประโยชน์มาก http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

ข้อมูลที่เก็บไว้ในฐานข้อมูลไม่ควรถูกทำให้เป็นอนุกรมอีกต่อไปตอนนี้มันควรถูกบันทึกเป็นวัตถุ JSON

โมดูลส่วนใหญ่สร้างการอัพเดตข้อมูลที่ยกเลิกการเรียงข้อมูลในฐานข้อมูลและเก็บไว้อีกครั้งภายใต้รูปแบบ JSON (BTW ใช้เวลาสักครู่ในการเรียกใช้ ... )

ดังนั้นหากหนึ่งในโมดูลของคุณบันทึกข้อมูลที่เป็นอนุกรมในฐานข้อมูลที่ Magento อาจไม่สามารถอ่านข้อมูลได้อีกต่อไปคุณจะต้องสร้างไฟล์ติดตั้งการอัปเกรดข้อมูล นอกจากนี้อาจเป็นโมดูลของบุคคลที่สามที่จำเป็นต้องได้รับการอัปเดตเป็นรุ่นที่เข้ากันได้ 2.2+

หากคุณทำซีเรียลไลซ์ข้อมูลที่ไม่ระบุขนาดใดก็ได้ในรหัสของคุณคุณอาจต้องเปลี่ยนสิ่งนั้นเช่นกัน

ฉันหวังว่าสิ่งนี้จะให้ข้อมูลเชิงลึกที่ดีขึ้นแก่คุณเกี่ยวกับสิ่งที่ทำให้เกิดข้อผิดพลาดนี้

ไชโย!


ตรวจสอบให้แน่ใจว่าได้อ่านบันทึกประจำรุ่นสำหรับ 2.2.1 มีการเปลี่ยนแปลงล็อตรวมถึงเส้นทางสำหรับgenerationโฟลเดอร์ ;)
drew7721

1

ฉันลงเอยด้วยสถานการณ์เดียวกันทั้งหมด หลังจากเพิ่มรหัสด้านบนฉันได้รับ "อักขระ UTF-8 ที่มีรูปแบบไม่ถูกต้องอาจเข้ารหัสไม่ถูกต้อง"

ฉันคิดว่าคุณไม่ได้ใช้ภาษาเริ่มต้น ลองเปลี่ยนภาษาเป็น "เริ่มต้น" en_US

Meetanshi - ภาษาใดที่คุณใช้ในส่วนหน้าและการสร้างเนื้อหาคงที่ก็ล้มเหลวเช่นกัน?


สวัสดี @AP ฉันกำลังเผชิญกับข้อผิดพลาดเดียวกันและฉันใช้ภาษา de_DE
Meetanshi

ลองเปลี่ยนเป็น en_US ตาราง core_config_data (ทั่วไป / โลแคล / รหัส) ถึง en_US
AP

ข้อผิดพลาดเดียวกันหลังจากเปลี่ยนเป็น en_US
Meetanshi

ฉันจัดการเพื่อให้ได้ แต่อัพเมื่อพยายามกลับไปที่ fi_FI คุณล้างแคชหรือไม่
AP

ใช่ฉันล้างแคช
Meetanshi

0

สำหรับฉันทางออกคือการแทนที่อักขระพิเศษทั้งหมดเช่น "ä" ในไฟล์ csv การแปลด้วยอักขระ html เวอร์ชันเดียวกันนี้:

&auml;

จากนั้นฉันล้างแคชและโหลดส่วนหน้าใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.