Magento พร้อมสำหรับ PHP 7 แล้วหรือยัง?


71

PHP 7 กำลังเข้าสู่สถานะเบต้าและมีการทดสอบมากมายเกิดขึ้นในขณะนี้ เนื่องจาก Magento ติดตั้งภายในปีที่แล้วจาก "ทำงานเฉพาะบน PHP 5.3" ถึง "เข้ากันได้อย่างสมบูรณ์กับ PHP 5.6" ฉันต้องการทราบว่าพวกเขากำลังพิจารณาความเข้ากันได้ของ PHP 7 สำหรับ Magento 1.x และ Magento 2 มากเพียงใด

ฉันพบโพสต์นี้โดย Anna Filinaซึ่งเธอพบปัญหาหนึ่งใน Magento 1.9.1 (ยังคงไม่เปลี่ยนแปลงใน 1.9.2) แต่เนื่องจาก Magento 1 ไม่มีการทดสอบหน่วยฉันไม่เชื่อว่านี่เป็นปัญหาเดียว

ดังนั้นคำถามคือ: PHP 7 จะใช้งานร่วมกับ Magento 1 ได้หรือไม่ และเนื่องจาก Magento 2 อาจได้รับการทดสอบบน PHP 7 แล้ว (ขอบคุณการทดสอบอัตโนมัติ!) จะมีปัญหาที่ทราบบ้างหรือไม่?


ฉันเพิ่งลอง magento 2.1.2 บน php7 และมันไม่เป็นไป
guru1

@ guru1 คุณช่วยอธิบายได้มั้ย จากประสบการณ์ของฉันมันใช้งานได้ดี
Fabian Schmengler

@guru ... ฉันกำลังพัฒนาโครงการของฉันใน magento 2.1.2 ใน php 7 และทำงานได้ดี คุณประสบปัญหาอะไร
อึ๊ง

คำตอบ:


29

Magento ประกาศอย่างเป็นทางการเมื่อวันที่ 20 มกราคม 2016 CE และ EE 2.0.1 สนับสนุน PHP 7.0.2 อย่างเป็นทางการ

Magento Enterprise Edition และ Community Edition 2.0.1 มีวางจำหน่ายแล้วและมีคุณลักษณะความปลอดภัยที่สำคัญและการปรับปรุงการทำงานรวมถึงการสนับสนุนอย่างเป็นทางการสำหรับ PHP7.0.2

ลิงก์: https://magento.com/blog/technical/new-magento-20-resources-and-support-php7


26

หากคุณกำลังใช้รุ่นล่าสุดเอ็มซีอี 1.9.2.2 มีเป็นส่วนขยายที่จะนำมันมาเต็ม PHP 7 ความเข้ากันได้: https://github.com/Inchoo/Inchoo_PHP7 (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนถึงแม้ว่าจะมีชุมชนช่วยเหลือมากมาย)

นอกจากนี้ยังสามารถติดตั้งได้ผ่านการแต่งเพลงจากhttp://packages.firegento.com/

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


มันเป็นความคิดที่ดีมาก ๆ ที่จะลบล้างบางคนในท้องถิ่น ...
MagenX

2
@MagenX เว้นแต่คุณจะเป็นอินชอว์และรู้ว่าคุณกำลังทำอะไรอยู่)
7ochem

เราทุกคนทำสิ่งที่โง่เวลา .....
MagenX

2
ความเสี่ยงที่ใหญ่ที่สุดกับการแทนที่ในท้องถิ่นนั้นใช้กับเวอร์ชั่นวีโอไอพีที่เข้ากันไม่ได้จากรูปลักษณ์ของมันที่ผู้เขียนทำการปรับปรุงต่อไปด้วยเวอร์ชั่นวีโอไอพีรุ่นล่าสุด และถ้าคุณอยู่ในเวอร์ชั่นเก่ากว่าของวีโอไอพีการเล่นกับ PHP7 ก็คือ ... นอกจากนี้การทำตามแนวทางปฏิบัติที่ดีที่สุดแบบสุ่มนั้นก็โง่เช่นกันมีสถานการณ์ที่มันคุ้มค่าที่จะ "ทำลาย" ฉันคิดว่ามันเป็นเพียงตัวอย่างหนึ่งของแนวทางการขนส่งสินค้า " Btw ขยายเป็นที่น่ากลัว :)
grizwako

ปัญหาเดียวที่ฉันมีที่นี่คือการสนับสนุนของ mods เราไม่เคยรู้เลยว่าลูกค้าของเราจะต้องการใช้อะไรเมื่อมาถึง mods และต้องทำการทดสอบ / อัปเกรดทุก mod เพื่อให้เข้ากันได้กับ php 7 เป็นฝันร้าย
Bill Garrison

21

ไม่มีความคิดเกี่ยวกับ PHP7 แต่ฉันเดาว่าสิ่งส่วนใหญ่ยังคงใช้ได้ใน PHP7 คุณสามารถค้นหาข้อมูลเพิ่มเติมในบล็อกของMatthias Geniar

  • ext / mysql:แม้จะเป็นส่วนเสริม MySQL ที่เก่ามาก แต่ฉันก็ยังคงใช้กันอย่างแพร่หลาย แต่ถึงเวลาที่ทุกคนย้ายไปที่ pdo_mysql
  • set_magic_quotes_runtimeและmagic_quotes_runtime:ดูเหมือนว่าฉันเคยเห็นประกาศเลิกใช้ตั้งแต่ ... ตลอดกาล?
  • iconv.input_encoding, iconv.output_encoding:จนถึงตอนนี้ฉันไม่เคยใช้สิ่งเหล่านี้ ...
  • #ความคิดเห็นสไตล์ในไฟล์ ini:ไชโยสำหรับความสอดคล้องฉันต้องการเสมอ; (เซมิโคลอน) แสดงความคิดเห็นในไฟล์. ini!
  • preg_replace()ตัวดัดแปลง eval:ไชโยสำหรับ sysadmins ที่คำนึงถึงความปลอดภัย!

ฉันคิดว่าสิ่งเดียวที่เราอาจมีใน Magento เป็นpreg_replace()ตัวดัดแปลงที่น่าสนใจแต่หวังว่าจะไม่

นอกจากนี้ Magento ส่ง 1.9.2 พร้อม TAF ที่อัปเดตแล้วคุณสามารถค้นหาได้ใน dev ด้วยวิธีนี้คุณจะสามารถเรียกใช้การทดสอบส่วนหน้าบน PHP7 และตรวจสอบบันทึกได้ในภายหลัง


1
จุดสะท้อนของ Fabian ทางออกที่ดีที่สุดในการทดสอบคือเริ่มต้นด้วยการติดตั้ง 1.9.2 ที่สะอาดโหลดข้อมูลตัวอย่างจากนั้นเรียกใช้การทดสอบ TAF จะมีบางสิ่งบางอย่างที่ทำให้เกิดข้อผิดพลาดหรือแตกหักและอาจยิ่งเพิ่มมากขึ้นเมื่อคุณเริ่มเพิ่มส่วนขยายของบุคคลที่สามและการปรับแต่งที่คุณอาจเพิ่มไว้ในการติดตั้งของคุณ Zend ได้ทำการทดสอบ Magento ในการปล่อย PHP 7 และฉันจะแปลกใจหากมีปัญหาสำคัญใด ๆ แม้ว่าจะไม่ใช่ว่าอาจมีปัญหาเล็กน้อยหลายอย่าง หุ้น 1.9.2 เป็นสถานที่สำหรับเริ่มการทดสอบ ....
ไบรอัน 'BJ' Hoffpauir Jr.

คำอธิบายที่ดี Fabian..thx
Amit Bera

2
ฉันได้ทำการทดสอบ Magento 1.9CE บน php7 beta แล้วมันสร้างความแตกต่างอย่างมากสำหรับผู้ดูแลระบบ ... งานแคตตาล็อก ฯลฯ นั้นรวดเร็วมาก ในร้านค้าผลิตภัณฑ์ 3,000 แห่งหน้ารายการผู้ดูแลระบบแคตตาล็อกเริ่มตั้งแต่โหลด 12 วินาที (php5-fpm) เป็น 3.5 วินาที (php7-fpm) เรามีความกระตือรือร้นที่จะใช้สิ่งนี้ในการผลิตดังนั้นฉันจึงใช้ nginx เพื่อกำหนดเส้นทางการรับส่งข้อมูล URL ของผู้ดูแลระบบผ่าน php7 และรักษาปริมาณการใช้งานหน้าไว้ที่ php5-fpm ในตอนนี้ ตื่นเต้นสำหรับการเปิดตัว php7 :)
Ricky Odin Matthews

@RickyOdinMatthews สิ่งนี้มีผลกับคุณอย่างไร ยังคงใช้งานผู้ดูแลระบบได้เฉพาะบน php7 หรือไม่ มีปัญหาอะไรไหม? คุณสามารถแชร์ส่วนหนึ่งของการกำหนดค่า NGINX ที่กำหนดเส้นทางผู้ดูแลระบบไปยัง php7 ได้หรือไม่?
Ottonet

1
@Ottonet ใช่ยังคงใช้งานได้กับผู้ดูแลระบบ ฉันใส่สารสกัด 'เริ่มต้น' ของฉันที่นี่สำหรับคุณpastebin.com/9z1U94ug
Ricky Odin Matthews

13

ไม่มีความคิดเห็นเกี่ยวกับ Magento 1 แต่ Magento 2 มีปัญหาบางอย่างกับชื่อคลาสเช่น "String" มันใช้เวลาไม่นานในการแก้ไข แต่มันก็ไม่ได้ทำงานนอกกรอบ ฉันคาดหวังว่า Magento 2 จะได้รับการแก้ไข แต่อาจยังไม่ได้รับการแก้ไขเนื่องจากมีลำดับความสำคัญอื่นก่อน


1
ตามอลันสำหรับข้อมูล สำหรับการอ้างอิงนี่เป็นปัญหา Github: github.com/magento/magento2/issues/1367 (คำอื่น ๆ ที่สงวนไว้เช่น "วัตถุ" ตามที่ดูเหมือน)
Fabian Schmengler

3
สถานะปัจจุบัน: ชื่อชั้นเรียนได้รับการแก้ไขในสาขาที่กำลังพัฒนาไม่มีประเด็นที่เป็นที่รู้จักอีกต่อไป
Fabian Schmengler

10

เกือบจะพร้อมแล้ว ฉันพยายามใช้ Magento 1.9.2.1 ที่สะอาดด้วย PHP 7 RC1 ซึ่งส่งผลให้เกิดความผิดพลาดทันที (ข้อผิดพลาดร้ายแรง) ของ Magento หลังจากแก้ไขปัญหานี้แล้วดูเหมือนว่าทุกอย่างจะทำงานได้ยกเว้นแบ็กเอนด์ซึ่งฉันไม่สามารถเข้าสู่ระบบได้ หลังจากนั้นมันกลับกลายเป็นปัญหาที่เกี่ยวข้องกับเซสชั่นซึ่งสามารถแก้ไขได้

สั้น ๆ :

  1. ข้อผิดพลาดร้ายแรงสามารถแก้ไขได้โดยการแทนที่Mage_Core_Model_Layoutแล้วเปลี่ยนสาย 555 จาก:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    เป็น
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. ปัญหาการใช้งานชั่วคราวสามารถแก้ไขได้โดยการเอาชนะMage_Core_Model_Session_Abstract_Varienและเขียนใหม่getData, setData, unsetData, addFullNamesวิธีการเพื่อให้ทุกที่ที่ถูกนำมาใช้ก็จะถูกแทนที่ด้วย$this->_data$_SESSION

ถ้ามีคนที่มีความสนใจในการแก้ปัญหาก็สามารถพบได้ที่นี่


1
แน่นอนว่ามีคนสนใจแก้ปัญหา ;-) คุณสามารถสรุปเนื้อหาของบทความที่เชื่อมโยงได้หรือไม่? ไม่มีอะไรผิดปกติในการเชื่อมโยงบล็อกของคุณกับข้อมูลเพิ่มเติม แต่คำตอบควรจะสามารถยืนได้ด้วยตัวเอง
Fabian Schmengler

คำถามก็คือ Magento พร้อมสำหรับ PHP 7 ไม่ใช่เกี่ยวกับวิธีทำให้พวกเขาทำงานร่วมกันได้หรือไม่ อย่างไรก็ตามฉันได้อัปเดตคำตอบของฉันด้วยคำตอบสั้น ๆ
Zsolti

1
ข้อผิดพลาดที่คล้ายกันเกิดขึ้นในVarien_File_Uploaderดูmagento.stackexchange.com/questions/93066/…
Fabian Schmengler

เหมือนกันสำหรับ 1.9.2.4
lrkwz

8

Magento2 พร้อมใช้งานสำหรับ PHP 7 การปรับเปลี่ยนโค้ดเป็น PHP7 เสร็จสิ้นแล้วและการเปลี่ยนแปลงทั้งหมดมีให้ในสาขาการพัฒนา ดูปัญหาในGitHub

นอกจากนี้การรองรับ php 7 ใน Magento1 ต้องการการเปลี่ยนแปลงที่เข้ากันไม่ได้ย้อนหลังและฉันคิดว่าจะไม่รองรับอย่างเป็นทางการ


เป็นเรื่องที่น่าอัศจรรย์ใจอย่างยิ่งที่ M2 และ PHP 7 จะเปิดตัวในเดือนเดียวกัน - พฤศจิกายน 2558!
FireBear

7

มีปัญหาเกี่ยวกับวิธีที่วีโอไอพีคำนวณผลรวมยอดสั่งซื้อและการใช้ส่วนลด นี่เป็นการหยุดการชำระเงินด่วนด้วย Paypal เนื่องจากรายการโฆษณาไม่ได้รวมยอดรวมทั้งหมดด้วยส่วนลด

ปัญหาดูเหมือนว่าMage_Sales_Model_Config_Ordered::_compareTotals()จะไม่ทำงานเหมือนกันใน PHP7 เป็น PHP5 และuasort()ตอนนี้ก็ขึ้นอยู่กับความสัมพันธ์สกรรมกริยาสำหรับการสั่งซื้อ แต่สิ่งนี้ไม่จำเป็นสำหรับผลรวมการสั่งซื้อทั้งหมด

ลองใช้: -

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

ยอดเยี่ยมตอกภาษีขึ้น + 20% แปลก ๆ ของฉันทั้งหมด
evensis

6

นี่คืองานวิจัยของฉันฉันต้องการแบ่งปันกับคุณเกี่ยวกับความไม่ลงรอยกันของ Magento php7 ขณะนี้ฉันพบบางสถานที่ที่โค้ดควรล้มเหลวเนื่องจากไวยากรณ์ของชุดตัวแปร

ไฟล์: แอพ / รหัส / core / Mage / ImportExport / รุ่น / ส่งออก / นิติบุคคล / ผลิตภัณฑ์ / ประเภท / Abstract.php

วิธีการ: overrideAttribute

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

ไฟล์: app / code / core / Mage / ImportExport / Model / Export / Entity / Customer.php

วิธีการ: filterAttributeCollection

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

ไฟล์: แอพ / รหัส / core / Mage / ImportExport / Model / นำเข้า / Uploader.php

วิธีการ: _validateFile

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

ไฟล์: แอพ / รหัส / แกน / Mage / แคตตาล็อก / รุ่น / ผลิตภัณฑ์ / ลิงค์ / Api / V2.php

วิธีการ: มอบหมาย

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

ไฟล์: แอพ / รหัส / แกน / Mage / แคตตาล็อก / รุ่น / ผลิตภัณฑ์ / ลิงค์ / Api / V2.php

วิธีการ: อัพเดต

$data->$attribute['code']

ไฟล์: lib / Varien / File / Uploader.php

วิธีการ: _validateFile

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

ไฟล์: app / code / core / Mage / Core / Model / Layout.php

วิธีการ: getOutput

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

5

นอกจากคำตอบอื่น ๆ ที่เกี่ยวข้องกับ Magento 1:

ความไม่ลงรอยกันของ PHP 7 ในZend_XmlRpc_Serverได้รับการแก้ไขใน Zend Framework 1.12.12

ทุกรุ่นก่อน CE 1.9.2.2 / EE 1.14.2.2 ใช้ Zend Framework รุ่นเก่ากว่าดังนั้นอาจมีปัญหาหากคุณใช้ XML-RPC API ของ Magento


1

ตรวจสอบไฟล์จาก inchoo ซึ่งเปลี่ยนเป็นทำให้ M1 เข้ากันได้กับ php 7 ซึ่งเป็นการเปลี่ยนแปลงเล็กน้อยในไฟล์เพียงเล็กน้อย แต่ทำงานอย่างชาญฉลาดจาก Inchoo https://github.com/Inchoo/Inchoo_PHP7/tree/master/app/code/local/Inchoo/PHP7


1
URL พื้นฐานสำหรับโครงการจาก Inchoo => github.com/Inchoo/Inchoo_PHP7
Fiasco Labs

1

ฉันใช้ Magento 2 CE เวอร์ชั่น 2.1.4 และใช้งานได้ดี

วีโอไอพี \ แอป \ 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

คำตอบสั้น ๆ ก็คือมันไม่ได้ Magento CE 1.9.2.4 รองรับ PHP 5.4 และ 5.5 อย่างเป็นทางการเท่านั้น และแม้ว่า PHP 5.6 จะทำงานได้ดี แต่มันก็เต็มไปด้วยล็อกไฟล์ที่มีข้อความเตือนมากมาย

คำตอบยาว ๆ คือมันค่อนข้างง่ายที่จะแก้ไขเพื่อให้รองรับ PHP7 อย่างไรก็ตามส่วนขยายจำนวนมากยังคงไม่สามารถใช้งานกับ PHP7 ได้ดังนั้นคุณจึงเป็นเจ้าของด้วยตัวคุณเอง


0

PHP 7.0 คือจุดสิ้นสุดของชีวิต ณ สัปดาห์แรกของเดือนธันวาคม 2018

ในฐานะที่เป็นโพสต์นี้เวอร์ชั่นปัจจุบันของ Magento 2.2.3 (20 กุมภาพันธ์ 2018 รุ่น) ไม่รองรับ PHP 7.1 หรือ PHP 7.2

คุณสามารถยืนยันรุ่นที่รองรับได้โดยตรวจสอบapp/bootstrap.phpในโฟลเดอร์การติดตั้ง Magento ของคุณและค้นหารหัสที่คล้ายกับที่แสดงต่อไปนี้:

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

ดูเหมือนจะมีปัญหา.htaccessที่ทำให้เกิดข้อผิดพลาด 500 กับ apache 2.4

นอกจากนี้ไฟล์ผู้แต่งที่มีการอ้างอิงสำหรับ php5.5 เท่านั้น

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