Magento 2.2: Không thể xác định giá trị?


33

Chạy vào các vấn đề trên một trang web chạy Magento 2.2.0-rc3.0 / PHP 7.0.23

Sự cố sau xảy ra với tất cả các tiện ích mở rộng của bên thứ 3 được bật hoặc tắt.

Khi thêm một mục để so sánh từ danh mục hoặc trang sản phẩm hoặc gửi đánh giá từ trang sản phẩm, chúng tôi gặp lỗi sau trong trình duyệt:

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}

Lỗi không biến mất trừ khi bạn xóa cookie, đặc biệt là cookie mage-message. nhập mô tả hình ảnh ở đây

Bất kỳ trợ giúp trong việc khắc phục các lỗi này được đánh giá cao.


Đó không phải là một lỗi cốt lõi sao? Có vấn đề GitHub cho việc này?
Alex

điều này sẽ cung cấp cho bạn một ý tưởng thương mại điện tử
mage.com / blog / từ

Câu trả lời:


59

Tôi đã có thể giải quyết vấn đề này bằng cách xóa Bộ nhớ cache Redis của tôi từ CLI

redis-cli flushall

Tôi hy vọng điều này sẽ giúp người dùng trong tương lai.


2
Hoàn thành tốt Đây có lẽ nên là câu trả lời được chấp nhận.
Shawn Abramson

Nó dường như không phải luôn luôn là giải pháp. Trong trường hợp của tôi, tôi thậm chí không sử dụng redis (chưa)
Alex

cảm ơn. Tôi khởi động lại véc ni, nghĩ rằng nó sẽ tuôn ra nó, nhưng điều này đã lừa.
ladle3000

nó hoạt động với tôi
Jared Chu

Điều này giúp tôi trong khi nâng cấp từ 2.2.9 lên 2.3.2. Tôi đã gặp lỗi khi thực hiện cài đặt
Mohammed Joraid

30

Vấn đề nằm ở /vendor/magento/framework/Serialize/Serializer/Json.php có một hàm unserialize ($ chuỗi) cung cấp cho bạn một lỗi cú pháp nếu chuỗi được tuần tự hóa (không phải json mà là tuần tự hóa php).

Có một cách giải quyết - bạn có thể kiểm tra xem chuỗi có được tuần tự hóa (so với mã hóa json) và sau đó sử dụng tuần tự hóa (chuỗi $). Thay đổi unserialize thành:

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

và thêm chức năng để kiểm tra nếu chuỗi được nối tiếp:

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

Sau khi cứu được. không có vấn đề gì, bạn có thể khôi phục lớp về mặc định và sẽ không có vấn đề như vậy trong tương lai.


1
Nó hoạt động tốt 100% cho tôi. Cảm ơn rất nhiều!
mapaladiya

2
nó không hoạt động ... :-(
Arfan Mirza

Kiểm tra xem điều gì xảy ra nếu giá trị a: 0: {} được thông qua. Đi từng dòng một. Điều gì xảy ra nếu kết quả của unserialize được truyền cho một phương thức gõ mạnh đang mong đợi một mảng? Bạn có thể muốn thay đổi câu trả lời của bạn.
vitoriodachef

20

Không chỉnh sửa các tập tin cốt lõi cho giải pháp. Ghi đè theo cách sau Chỉ cần đặt dòng sau trong di.xml trong thư mục vv

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

Và bên trong Namespace \ ModuleName \ serialize \ serializer Directory: file 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;
    }
}

Hoạt động hoàn hảo


2
Việc thực hiện là thiếu sót. Điều gì xảy ra nếu giá trị a: 0: {} được truyền cho phương thức Json: unserialize? Đó có phải là hành vi mong muốn? Điểm của biến kết quả trong phương thức is_serialized là gì? Nó không được trả về và nó không có tác động đến bất cứ điều gì vì tại cuộc gọi phương thức, không có biến nào được chuyển làm đối số thứ hai.
vitoriodachef

Đây phải là giải pháp được chấp nhận và tốt hơn nhiều so với bài viết ở trên để chỉnh sửa tệp trực tiếp trong nhà cung cấp. Nhiều khả năng, bạn sẽ phải chạy tác vụ nâng cấp thiết lập cục bộ và sau đó một lần nữa vào việc dàn dựng / sản xuất, do đó, nó sẽ phải duy trì môi trường và nhà cung cấp / thư mục là một tạo phẩm được tạo khi xây dựng.
Mark Shust

@vitoriodachef Tôi đang đối mặt với trường hợp chính xác mà bạn đã đề cập. Bạn đã tìm thấy giải pháp nào chưa?
Knight017

Tôi đã sử dụng hàm sau để quyết định hàm riêng làSerialized ($ value) {return (boolean) preg_match ('/ ^ ((s | i | d | b | a | O | C): | N;) /', $ value ); }
Knight017

Không làm việc. Tôi đã phải thay đổi thủ công tất cả các mục trong DB từ a:0:{}thành[]
localhost

16

Trong trường hợp của tôi, tôi đã vá như sau để hủy xác định chuỗi được xê-ri hóa: Tệp: /vendor/magento/framework/Serialize/Serializer/Json.php

Tìm thấy:

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

thay thế bởi:

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

Tôi đã thử điều này nhưng nó không hoạt động như mong đợi. Có ai đã thử nó chưa và nếu nó hoạt động, xin hãy giúp tôi
Siva

Những vấn đề bạn đang phải đối mặt?
MageLearner

Vấn đề đã được khắc phục. Cam ơn vi đa hỏi!
Siva

1
Grt ... Cảm ơn bạn !!!
MageLearner

1
Cảm ơn @MageLearner, Nó cũng hoạt động trong 2.3.1 sau khi di chuyển dữ liệu từ magento 1 sang magento 2
Pradeep Thakur

5

Sau khi xả Redis, vấn đề đã được sắp xếp. Cảm ơn bạn Craig cho giải pháp.

Tôi đang sử dụng cổng 6379 cho bộ đệm, vì vậy tôi chạy lệnh:

redis-cli -p 6379 flushall

4

Nó chủ yếu liên quan đến Redis cache, vì vậy hãy thử xóa nó bằng lệnh đơn giản trong SSH của bạn

redis-cli flushall


3

Hóa ra đó là một vấn đề về quyền, trong đó magento đang thiết lập quyền cho các tệp được tạo bị hạn chế trên máy chủ này.

Giải quyết bằng cách tạo tệp magento_umask trong thư mục gốc với ô thích hợp cho máy chủ.

Xem http://devdocs.magento.com/guides/v2.2/install-gde/install/post-install-umask.html để biết thêm chi tiết.


Xin chào, tôi đang đối mặt với vấn đề liên quan như thế này. Bạn có thể xin vui lòng nhìn vào để này .
Aditya Shah

@chunk tất cả các thư mục của tôi là 755 và các tệp là 644, ô nào thích hợp để đặt? tia
Kris Wen

2

Câu trả lời của Sameers ở trên đã làm việc cho tôi mặc dù tôi phải sử dụng các mã khác nhau trong khối.

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

Thư mục ROOT 1. public_html/vendor/magento/framework/Serialize/Serializer/Json.php

Tải xuống JSON.php https://gist.github.com/manojind/9f18bbecaeb3e2bbfb056a634ade62a2

2. Chỉ cần thay thế chức năng bên dưới (unserialize) và thêm chức năng mới HOẶC chỉ cần tải xuống tệp đính kèm và thay thế bằng mặc định

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. Thêm chức năng mới:

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

Vấn đề của tôi không được khắc phục .. xin vui lòng giúp tôi
Muhammad Ahmed

1

Cá nhân tôi thấy vấn đề này đã dẫn đến việc nó đang chạy lệnh:

php bin/magento setup:upgrade

Sau một cuộc di cư. Tôi phát hiện ra rằng tôi đã thiếu khóa băm " mật mã " trong src/app/etc/env.php:

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

    ...

Đảm bảo rằng điều này không trống và tốt nhất là phù hợp với môi trường khác của dự án của bạn!


Tôi đã để trống khóa mật mã trong quá trình cài đặt, mong muốn một khóa mới được tạo, điều này rõ ràng không xảy ra.
Shapeshifter

0

Tôi đã nhận được lỗi trong một trang CMS ở phía trước.

Đó là mã widget Magento trong Nội dung trang CMS đã gây ra sự cố (mà tôi đã sao chép từ một nguồn khác). Tôi đã xóa mã widget và chèn cùng một widget bằng nút Chèn Widget trong màn hình chỉnh sửa Trang CMS và nó đã hoạt động.

Quá trình trên định dạng mã widget khác nhau và nó làm cho lỗi biến mất.


0

Tôi phát hiện ra rằng toàn bộ dữ liệu được tuần tự hóa không thể phù hợp với cột bảng cơ sở dữ liệu MySQL với TEXTkiểu dữ liệu.
Tôi chỉ tìm thấy flag_datagiá trị cột củasystem_config_snapshot dòng được cắt.

Tôi đã phải thay đổi nó MEDIUMTEXTcho cột này flag.flag_data.


0

Đã lỗi tương tự. Khi cố gắng cập nhật cơ sở dữ liệu (ver 2.2.6) bằng mã mới (ver 2.3.2).

Để sửa lỗi

composer update

0

Đây không phải là cách tốt nhất để chạy sql trực tiếp nhưng tôi đã làm điều đó để tiết kiệm thời gian của mình. Chỉ cần chạy truy vấn này

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

Nếu bạn ở trên 2.3.0 trở lên, bạn sẽ muốn sử dụng giải pháp được cung cấp bởi MageLearner. Cách cũ hơn với các báo cáo trường hợp là lỗi thời. Nếu bạn không sử dụng giải pháp MageLearner trên 2.3.0 trở lên; bạn sẽ gặp phải tất cả các vấn đề với việc xem dữ liệu đơn hàng và các sản phẩm có thể định cấu hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.