Чи готовий Magento до PHP 7?


71

PHP 7 досягає бета-статусу, і наразі триває багато тестувань. Враховуючи, що Magento наздогнав протягом останнього року від "працює лише на PHP 5.3" до "повністю сумісного з PHP 5.6", я хотів би знати, наскільки вони розглядають сумісність PHP 7 для Magento 1.x, а також Magento 2.

Я знайшов цю публікацію від Анни Філіної, де вона знайшла один випуск у Magento 1.9.1 (все ще незмінний у 1.9.2), але враховуючи, що Magento 1 не має одиничних тестів, я не вірю, що це був єдиний випуск.

Отже, питання: чи буде забезпечена сумісність PHP 7 для Magento 1? А оскільки Magento 2, ймовірно, вже перевірений на PHP 7 (Спасибі автоматизованим тестам!), Чи є відомі проблеми?


Я тільки що спробував magento 2.1.2 на php7, і це не йде.
гуру1

@ guru1 Чи можете ви детально пояснити, чому? На мій досвід, це працює добре.
Фабіан Шменглер

@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

Якщо ви використовуєте останню версію, M CE 1.9.2.2, є розширення, яке приведе її до повної сумісності PHP 7: https://github.com/Inchoo/Inchoo_PHP7 . (Відмова: Я автор, хоча допомога громади є великою.)

Його також можна встановити через Composer з http://packages.firegento.com/ .

Усі несумісності, згадані тут, виправлені. Ми вважаємо, що може бути ще кілька крайових випадків, але нічого не зупиняється. Запрошення на тестування, повідомлення про видачу звітів та витягнутих пропозицій вітаються


Дуже погана ідея ставити деякі місцеві рішення ...
MagenX

2
@MagenX, якщо ти не Inchoo і не знаєш, що робиш;)
7ochem

всі ми робимо дурні речі час від часу .....
MagenX

2
Найбільший ризик для локальних перекриттів - це використання їх з несумісною версією magento, оскільки зовнішній вигляд автора постійно підтримує розширення до останньої версії magento. А якщо ви перебуваєте в старшій версії магенто, грати з PHP7 - це ... Також сліпо слідувати кращим практикам теж нерозумно, є ситуації, коли варто їх "зламати". Я думаю, що це лише ще один приклад підходу «культового культу». Btw, розширення приголомшливо :)
grizwako

Єдина проблема, яка у мене є, - це підтримка модів. Ми ніколи не знаємо, що наші клієнти захочуть використовувати, коли мова йде про моди, і тестування / оновлення кожного мода, щоб бути сумісним php 7, - це кошмар.
Білл Гаррісон

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: ура для безпечних системних адміністраторів!

Я думаю, що єдине, що ми можемо мати в Magento - це preg_replace()модифікатор eval, але, сподіваємось, ні.

Окрім цього, Magento постачав 1.9.2 з оновленим TAF, який ви можете знайти у розробці. За допомогою цього ви зможете запустити купу тестів на передньому рівні на PHP7 та оглянути журнал після цього


1
Повторюючи думку Фабіана, найкраще тестувати - почати з чистої установки 1.9.2, завантажити зразки даних, а потім виконати тести TAF. Безперечно, будуть деякі речі, які призводять до помилок або помилок, і, мабуть, ще більше, коли ви почнете додавати сторонні розширення та будь-які налаштування, які, можливо, ви додали до встановлення. Зенд тестував Magento на релізі PHP 7, і я був би здивований, якби були якісь основні проблеми, хоча це не так, що БУДЕ МАЛІ незначних проблем. Запас 1.9.2 - це місце для початку випробувань ....
Bryan 'BJ' Hoffpauir Jr.

Гарне пояснення Фабіан..thx
Аміт Бера

2
Я тестував Magento 1.9CE на бета-версії php7, це велика різниця для панелі адміністратора ... Завдання каталогів тощо так швидко. У магазині товарів 3000, сторінка адміністратора списку каталогів перейшла від завантаження 12 (php5-fpm) до 3,5s (php7-fpm). Ми прагнемо використовувати це у виробництві, тому я використовую nginx для маршрутизації трафіку URL-адреси адміністратора через php7, і зараз зберігаю фронтальний трафік на php5-fpm. Раді за випуск php7, однак :)
Рікі Одін Меттьюз

@RickyOdinMatthews Як це працює для вас? Все ще працює адміністратор лише на php7? Якісь питання? Не могли б ви поділитись частиною конфігурації NGINX, яка спрямовує адміністратора до php7?
Оттонет

1
@Ottonet так, він все ще використовує його в адміністраторі. Я поставив сюди для вас pastebin.com/9z1U94ug
Ricky Odin Matthews

13

Немає коментарів щодо Magento 1, але у Magento 2 були деякі проблеми з назвами класів на кшталт "String". Не потрібно було довго виправляти, але це не вийшло з коробки. Я очікую, що Magento 2 буде виправлений, але він, можливо, ще не виправлений через перші пріоритети.


1
Танс Алан для інформації. Для довідки, це випуск Github: github.com/magento/magento2/isissue/1367 (ще інші зарезервовані слова, такі як "об'єкт", як здається)
Fabian Schmengler

3
Поточний стан: назви класів зафіксовані в галузі розвитку, більше невідомих питань
Фабіан Шменглер

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
Звичайно, хтось зацікавлений у рішенні ;-) Чи можете ви підсумувати зміст пов'язаної статті? Немає нічого поганого в тому, щоб пов’язати свій блог із додатковою інформацією, але відповідь повинна мати можливість самостійно.
Фабіан Шменглер

Ну, питання полягало у тому, чи готовий 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 будуть випущені в тому ж місяці - листопаді 2015 року!
FireBear

7

Існує проблема з тим, як Magento підраховує загальну суму замовлення та застосовує знижки. Це також зупиняє експрес-оформлення оплати через 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']();

Файл: додаток / код / ​​core / Mage / ImportExport / Модель / Експорт / Субстанція / Customer.php

Метод: filterAttributeCollection

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

Файл: додаток / код / ​​core / Mage / ImportExport / Модель / Імпорт / Uploader.php

Метод: _validateFile

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

Файл: додаток / код / ​​core / Mage / Каталог / Модель / Продукт / Посилання / Api / V2.php

Метод: призначити

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

Файл: додаток / код / ​​core / Mage / Каталог / Модель / Продукт / Посилання / Api / V2.php

Метод: оновлення

$data->$attribute['code']

Файл: lib / Varien / File / Uploader.php

Метод: _validateFile

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

Файл: додаток / код / ​​core / Mage / Core / Model / Layout.php

Метод: getOutput

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

5

На додаток до інших відповідей, пов'язаних з Magento 1:

Zend_XmlRpc_ServerНевідповідність PHP 7 у зафіксована у Zend Framework 1.12.12

Всі версії, що передували CE 1.9.2.2 / EE 1.14.2.2, використовують старішу версію Zend Framework, тому можуть виникнути проблеми, якщо ви використовуєте API XML-RPC Magento.



1

Я використовую Magento 2 CE версії 2.1.4 і працює чудово.

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

Коротка відповідь - ні, це не так. 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 помилок з апашем 2.4.

Крім того, включений файл композитора містить лише залежності для php5.5

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.