Magento đã sẵn sàng cho PHP 7 chưa?


71

PHP 7 đang đạt đến trạng thái beta và rất nhiều thử nghiệm đang diễn ra vào lúc này. Cho rằng Magento đã bắt kịp trong năm ngoái từ "chỉ chạy trên PHP 5.3" đến "tương thích hoàn toàn với PHP 5.6", tôi muốn biết họ đang xem xét khả năng tương thích PHP 7 cho Magento 1.x cũng như Magento 2 như thế nào.

Tôi đã tìm thấy bài đăng này của Anna Filina khi cô ấy tìm thấy một vấn đề trong Magento 1.9.1 (vẫn không thay đổi trong 1.9.2), nhưng do Magento 1 không có bài kiểm tra đơn vị, tôi không tin rằng đây là vấn đề duy nhất.

Vì vậy, câu hỏi là: khả năng tương thích PHP 7 cho Magento 1 có được đảm bảo không? Và vì Magento 2 có thể đã được thử nghiệm trên PHP 7 (Cảm ơn các bài kiểm tra tự động!), Có vấn đề nào được biết không?


Tôi mới dùng thử magento 2.1.2 trên php7 và nó không hoạt động.
guru1

@ guru1 Bạn có thể giải thích, tại sao? Theo kinh nghiệm của tôi, nó hoạt động tốt.
Fabian Schmengler

@guru ... Tôi đang phát triển dự án của mình trong magento 2.1.2 trên php 7 và nó hoạt động tốt. Vấn đề bạn gặp phải là gì?
Jai

Câu trả lời:



26

Nếu bạn đang sử dụng phiên bản mới nhất, M CE 1.9.2.2, có một tiện ích mở rộng sẽ mang lại cho nó khả năng tương thích đầy đủ với PHP 7: https://github.com/Inchoo/Inchoo_PHP7 . (Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả, mặc dù có nhiều sự giúp đỡ từ cộng đồng.)

Nó cũng có thể cài đặt thông qua Trình soạn thảo từ http://packages.firegento.com/ .

Tất cả sự không tương thích được đề cập ở đây là cố định. Chúng tôi nghĩ rằng vẫn có thể có một vài trường hợp cạnh, nhưng không có gì dừng lại. Kiểm tra, báo cáo vấn đề và yêu cầu kéo được chào đón.


đó là ý tưởng rất tồi để đặt một số ghi đè cục bộ ...
MagenX

2
@MagenX trừ khi bạn là Inchoo và biết bạn đang làm gì;)
7ochem

tất cả chúng ta đều làm những điều ngu ngốc,
thỉnh thoảng

2
Rủi ro lớn nhất với các phần ghi đè cục bộ là sử dụng chúng với phiên bản magento không tương thích, từ ngoại hình của nó, tác giả đang cập nhật với phiên bản magento mới nhất. Và nếu bạn đang dùng phiên bản magento cũ hơn, chơi với PHP7 là ... Ngoài ra, việc mù quáng tuân theo các thực tiễn tốt nhất cũng là điều ngu ngốc, có những tình huống đáng để "phá vỡ chúng". Tôi nghĩ rằng đó chỉ là một ví dụ nữa của phương pháp "sùng bái hàng hóa". Btw, tiện ích mở rộng thật tuyệt vời :)
grizwako

Vấn đề duy nhất tôi có ở đây là hỗ trợ mod. Chúng tôi không bao giờ biết những gì khách hàng của chúng tôi sẽ muốn sử dụng khi nói đến mod và phải kiểm tra / nâng cấp mọi mod để tương thích với php 7 là một cơn ác mộng.
Bill Garrison

21

Không biết gì về PHP7, nhưng tôi đoán hầu hết mọi thứ vẫn còn hiệu lực trong PHP7, bạn có thể tìm thêm thông tin trong blog của Matthias Geniar

  • ext / mysql: mặc dù nó là một phần mở rộng MySQL rất cũ, tôi cho rằng nó vẫn được sử dụng rất rộng rãi, nhưng đã đến lúc mọi người chuyển sang pdo_mysql.
  • set_magic_quotes_runtimemagic_quotes_runtime: có vẻ như tôi đã thấy những thông báo phản đối này kể từ ... mãi mãi?
  • iconv.input_encoding, iconv.output_encoding: cho đến nay, tôi chưa bao giờ sử dụng cho những ...
  • #nhận xét kiểu trong các tệp ini: hooray cho tính nhất quán, tôi luôn luôn thích; (dấu chấm phẩy) nhận xét trong tệp .ini!
  • preg_replace()sửa đổi eval: hooray cho sysadins có đầu óc bảo mật!

Tôi nghĩ rằng điều duy nhất chúng ta có thể có trong Magento là preg_replace()sửa đổi eval nhưng hy vọng là không.

Bên cạnh đó, Magento vận chuyển 1.9.2 với một TAF được cập nhật, bạn có thể tìm thấy trong dev. Với điều này, bạn sẽ có thể chạy một loạt các bài kiểm tra frontend trên PHP7 và kiểm tra nhật ký sau đó


1
Báo lại quan điểm của Fabian, cách tốt nhất để kiểm tra của bạn là bắt đầu với cài đặt 1.9.2 sạch, tải dữ liệu mẫu, sau đó chạy thử nghiệm TAF. Chắc chắn sẽ có một số thứ gây ra lỗi hoặc hỏng, và có thể còn nhiều hơn nữa khi bạn bắt đầu thêm Tiện ích mở rộng của bên thứ 3 và bất kỳ tùy chỉnh nào bạn có thể đã thêm vào cài đặt của mình. Zend đã thử nghiệm Magento trên phiên bản PHP 7 và tôi sẽ ngạc nhiên nếu có bất kỳ vấn đề lớn nào, mặc dù không có nhiều vấn đề nhỏ. Stock 1.9.2 là nơi để bắt đầu thử nghiệm ....
Bryan 'BJ' Hoffpauir Jr.

Giải thích tốt Fabian..thx
Amit Bera

2
Tôi đã thử nghiệm Magento 1.9CE trên php7 beta, nó tạo ra sự khác biệt rất lớn cho bảng quản trị ... Các tác vụ của danh mục, v.v rất nhanh. Trên một cửa hàng 3000 sản phẩm, trang quản trị danh sách danh mục đã chuyển từ 12 giây tải (php5-fpm) lên 3.5s (php7-fpm). Chúng tôi rất muốn sử dụng điều này trong sản xuất, vì vậy hiện tại tôi đang sử dụng nginx để định tuyến lưu lượng truy cập url của quản trị viên thông qua php7 và giữ lưu lượng truy cập trực tiếp trên php5-fpm. Tuy nhiên, rất phấn khích khi phát hành php7 :)
Ricky Odin Matthews

@RickyOdinMatthews Điều này phù hợp với bạn như thế nào? Vẫn chỉ chạy admin trên php7? Có vấn đề gì không? Bạn có thể chia sẻ một phần của cấu hình NGINX định tuyến quản trị viên đến php7 không?
Ottonet

1
@Ottonet có, vẫn sử dụng nó trên admin. Tôi đã đặt trích xuất conf 'mặc định' của mình ở đây cho bạn pastebin.com/9z1U94ug
Ricky Odin Matthews

13

Không có nhận xét về Magento 1, nhưng Magento 2 đã có một số vấn đề với các tên lớp như "Chuỗi". Nó không mất nhiều thời gian để sửa chữa, nhưng nó không hoạt động. Tôi hy vọng rằng Magento 2 sẽ được sửa chữa, nhưng nó có thể chưa được sửa chữa do các ưu tiên khác trước.


1
Thans Alan cho thông tin. Để tham khảo, đây là vấn đề Github: github.com/magento/magento2/issues/1367 (vẫn còn những từ dành riêng khác như "đối tượng" như có vẻ)
Fabian Schmengler 14/07/2015

3
Trạng thái hiện tại: tên lớp cố định trong nhánh phát triển, không có vấn đề nào được biết đến nhiều hơn
Fabian Schmengler

10

Nó gần như đã sẵn sàng. Tôi đã thử chạy Magento 1.9.2.1 sạch với PHP 7 RC1, dẫn đến sự cố ngay lập tức (lỗi nghiêm trọng) của Magento. Sau khi khắc phục sự cố này, mọi thứ dường như đang hoạt động, ngoại trừ phần phụ trợ mà tôi không thể đăng nhập. Sau đó, nó trở thành một vấn đề liên quan đến phiên có thể được vá.

Tóm tắt:

  1. Lỗi nghiêm trọng có thể được khắc phục bằng cách ghi đè Mage_Core_Model_Layoutsau đó thay đổi dòng 555 từ:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    thành
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. Vấn đề phiên tạm thời có thể được cố định bằng cách ghi đè Mage_Core_Model_Session_Abstract_Varienvà viết lại getData, setData, unsetData, addFullNamesphương pháp, vì vậy ở khắp mọi nơi, nơi $this->_datađã được sử dụng, nó sẽ được thay thế bằng $_SESSION.

Nếu ai đó quan tâm đến giải pháp, nó có thể được tìm thấy ở đây .


1
Tất nhiên ai đó quan tâm đến giải pháp ;-) Bạn có thể tóm tắt nội dung của bài viết được liên kết không? Không có gì sai khi liên kết blog của bạn với thông tin bổ sung, nhưng câu trả lời sẽ có thể tự đứng vững.
Fabian Schmengler

Chà, câu hỏi là liệu Magento đã sẵn sàng cho PHP 7 chưa, về cách làm cho chúng hoạt động cùng nhau. Nhưng dù sao, tôi đã cập nhật câu trả lời của mình bằng một giải pháp ngắn gọn.
Zsolti

1
Một lỗi tương tự xảy ra trong Varien_File_Uploader, xem magento.stackexchange.com/questions/93066/ trên
Fabian Schmengler

Tương tự cho 1.9.2.4
lrkwz

8

Magento2 đã sẵn sàng cho PHP 7. Việc điều chỉnh mã cho PHP7 đã được thực hiện và tất cả các thay đổi đều có sẵn trong nhánh phát triển. Xem vấn đề trên GitHub

Ngoài ra, hỗ trợ của php 7 trong Magento1 yêu cầu các thay đổi không tương thích ngược và tôi nghĩ sẽ không được hỗ trợ chính thức.


Thật tuyệt vời khi M2 và PHP 7 sẽ được phát hành trong cùng tháng - tháng 11 năm 2015!
FireBear

7

Có một vấn đề với cách Magento tính tổng đơn hàng lớn và áp dụng giảm giá. Điều này cũng dừng việc thanh toán Paypal Express, vì các chi tiết đơn hàng không cộng tổng số tiền giảm giá.

Vấn đề dường như Mage_Sales_Model_Config_Ordered::_compareTotals()là không hoạt động giống như trong PHP7 như PHP5 và uasort()hiện đang dựa vào mối quan hệ bắc cầu để đặt hàng, nhưng điều này không nhất thiết phải là tổng số đơn hàng.

Hãy thử sử dụng: -

protected function _getSortedCollectorCodes()
{
    if (Mage::app()->useCache('config')) {
        $cachedData = Mage::app()->loadCache($this->_collectorsCacheKey);
        if ($cachedData) {
            return unserialize($cachedData);
        }
    }
    $configArray = $this->_modelsConfig;
    // invoke simple sorting if the first element contains the "sort_order" key
    reset($configArray);
    $element = current($configArray);
    if (isset($element['sort_order'])) {
        uasort($configArray, array($this, '_compareSortOrder'));
    } else {
        foreach ($configArray as $code => $data) {
            foreach ($data['before'] as $beforeCode) {
                if (!isset($configArray[$beforeCode])) {
                    continue;
                }
                $configArray[$code]['before'] = array_unique(array_merge(
                    $configArray[$code]['before'], $configArray[$beforeCode]['before']
                ));
                $configArray[$beforeCode]['after'] = array_merge(
                    $configArray[$beforeCode]['after'], array($code), $data['after']
                );
                $configArray[$beforeCode]['after'] = array_unique($configArray[$beforeCode]['after']);
            }
            foreach ($data['after'] as $afterCode) {
                if (!isset($configArray[$afterCode])) {
                    continue;
                }
                $configArray[$code]['after'] = array_unique(array_merge(
                    $configArray[$code]['after'], $configArray[$afterCode]['after']
                ));
                $configArray[$afterCode]['before'] = array_merge(
                    $configArray[$afterCode]['before'], array($code), $data['before']
                );
                $configArray[$afterCode]['before'] = array_unique($configArray[$afterCode]['before']);
            }
        }
        foreach ($configArray as $code => $data) {
           $largest_small = $smallest_large = 0;
           foreach ($data['after'] as $afterCode) {
              if(isset($configArray[$afterCode]['sort_order']) && $largest_small < $configArray[$afterCode]['sort_order'])
                 $largest_small = $configArray[$afterCode]['sort_order'];
           }
           foreach ($data['before'] as $beforeCode) {
              if(isset($configArray[$beforeCode]['sort_order']) && ($smallest_large == 0 || $configArray[$beforeCode]['sort_order'] < $smallest_large)) 
                 $smallest_large = $configArray[$beforeCode]['sort_order'];
           }
           if($smallest_large <= $largest_small+1){
              if($smallest_large == 0) $smallest_large = $largest_small+1;
              $add = $largest_small+2-$smallest_large;
              foreach ($configArray as $code1 => $data1) {
                 if(!isset($data1['sort_order'])) break;
                 if($smallest_large <= $data1['sort_order'])
                    $configArray[$code1]['sort_order'] += $add;
               }
           }
           $configArray[$code]['sort_order'] = $largest_small+1;
        }
        uasort($configArray, array($this, '_compareSortOrder'));
    }
    $sortedCollectors = array_keys($configArray);
    if (Mage::app()->useCache('config')) {
        Mage::app()->saveCache(serialize($sortedCollectors), $this->_collectorsCacheKey, array(
                Mage_Core_Model_Config::CACHE_TAG
            )
        );
    }
    return $sortedCollectors;
}

Tuyệt vời, đóng đinh thuế kỳ lạ + 20% của tôi lên trên tổng số lớn.
evensis 17/03/2016

6

Đây là nghiên cứu của tôi, tôi muốn chia sẻ với bạn về sự không tương thích của magento php7. Hiện tại tôi đã tìm thấy một số nơi mã không thành công do cú pháp biến thống nhất.

Tệp: ứng dụng / mã / lõi / Mage / ImportExport / Model / Xuất / Thực thể / Sản phẩm / Loại / Tóm tắt.php

Phương thức: ghi đè Thuộc tính

$data['filter_options'] = $this->$data['options_method']();

Tệp: ứng dụng / mã / lõi / Mage / ImportExport / Model / Xuất / Thực thể / Khách hàng.php

Phương thức: bộ lọcAttributionCollection

$data['filter_options'] = $this->$data['options_method']();

Tệp: ứng dụng / mã / lõi / Mage / ImportExport / Model / Nhập / Uploader.php

Phương thức: _validateFile

$params['object']->$params['method']($filePath);

Tệp: ứng dụng / mã / lõi / Pháp sư / Danh mục / Mô hình / Sản phẩm / Liên kết / Api / V2.php

Phương pháp: gán

if (isset($data->$attribute['code'])) {
    $links[(int)$linkedProductId][$attribute['code']] = $data->$attribute['code'];
}

Tệp: ứng dụng / mã / lõi / Pháp sư / Danh mục / Mô hình / Sản phẩm / Liên kết / Api / V2.php

Phương pháp: cập nhật

$data->$attribute['code']

Tệp: lib / Varien / Tệp / Uploader.php

Phương thức: _validateFile

$params['object']->$params['method']($this->_file['tmp_name']);

Tệp: ứng dụng / mã / lõi / Mage / Core / Model / Layout.php

Phương thức: getOutput

$out .= $this->getBlock($callback[0])->$callback[1]();

5

Ngoài các câu trả lời khác liên quan đến Magento 1:

Không tương thích PHP 7 Zend_XmlRpc_Serverđã được sửa trong Zend Framework 1.12.12

Tất cả các phiên bản trước CE 1.9.2.2 / EE 1.14.2.2 đều sử dụng phiên bản Zend Framework cũ hơn, do đó có thể có vấn đề nếu bạn sử dụng API XML-RPC của Magento.



1

Tôi đang sử dụng Magento 2 CE Phiên bản 2.1.4 và hoạt động tốt.

magento \ app \ bootstrap.php

if (!defined('PHP_VERSION_ID') || !(PHP_VERSION_ID >= 50005 && PHP_VERSION_ID < 50700 || PHP_VERSION_ID === 70002 || PHP_VERSION_ID === 70004 || PHP_VERSION_ID >= 70006)) {
    if (PHP_SAPI == 'cli') {
        echo 'Magento supports PHP 5.6.5, 7.0.2, 7.0.4 and 7.0.6 or later. ' .
            'Please read http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html';
    } else {
        echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <p>Magento supports PHP 5.6.5, 7.0.2, 7.0.4 and 7.0.6 or later. Please read
    <a target="_blank" href="http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html">
    Magento System Requirements</a>.
</div>
HTML;
    }
    exit(1);
}

1

Câu trả lời ngắn gọn là không, nó không. Magento CE 1.9.2.4 chỉ hỗ trợ PHP 5.4 và 5.5 chính thức. Và trong khi PHP 5.6 chạy tốt, nó bão hòa các tệp nhật ký với vô số thông điệp cảnh báo.

Câu trả lời dài là việc sửa đổi nó để hỗ trợ PHP7 tương đối dễ dàng. Tuy nhiên, nhiều tiện ích mở rộng vẫn không tương thích với PHP7, do đó, phần lớn bạn chỉ có một mình.


0

PHP 7.0 là Kết thúc cuộc đời kể từ tuần đầu tiên của tháng 12 năm 2018.

Kể từ bài đăng này, phiên bản hiện tại của Magento 2.2.3 (phát hành ngày 20 tháng 2 năm 2018) không hỗ trợ PHP 7.1 hoặc PHP 7.2.

Bạn có thể xác nhận các phiên bản được hỗ trợ bằng cách kiểm tra app/bootstrap.phptrong thư mục cài đặt Magento của bạn và tìm mã tương tự như sau:

/* PHP version validation */
if (!defined('PHP_VERSION_ID') || !(PHP_VERSION_ID === 70002 || PHP_VERSION_ID === 70004 || PHP_VERSION_ID >= 70006)) {
    if (PHP_SAPI == 'cli') {
        echo 'Magento supports 7.0.2, 7.0.4, and 7.0.6 or later. ' .
            'Please read http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html';
    } else {
        echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <p>Magento supports PHP 7.0.2, 7.0.4, and 7.0.6 or later. Please read
    <a target="_blank" href="http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html">
    Magento System Requirements</a>.
</div>
HTML;
    }
    exit(1);
}

Dường như cũng có vấn đề .htaccessgây ra 500 lỗi với apache 2.4.

Ngoài ra, tệp soạn thảo bao gồm chỉ chứa các phụ thuộc cho php5.5

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.