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 и его нет.
guru1
@ guru1 Можете ли вы уточнить, почему? По моему опыту, это работает хорошо.
Фабиан Шменглер
@guru ... Я разрабатываю свой проект в magento 2.1.2 на php 7, и он работает нормально. С какой проблемой вы сталкиваетесь?
Jai

Ответы:

29

20 января 2016 года Magento официально объявила, что 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. И если вы используете более старую версию magento, играть с PHP7 - это ... Кроме того, слепо следовать передовым методам также глупо, есть ситуации, когда стоит их «сломать». Я думаю, что это просто еще один пример подхода "грузового культа". Кстати, расширение это здорово :)
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, который вы можете найти в dev. При этом вы сможете запускать несколько тестов внешнего интерфейса на PHP7 и впоследствии просматривать журнал

Фабиан Блехшмидт
источник
1
Повторяя точку зрения Фабиана, вам лучше всего начать тестирование с чистой установки 1.9.2, загрузить образцы данных, а затем запустить тесты TAF. Несомненно, будут некоторые вещи, которые выдают ошибки или сбои, и, возможно, даже больше, когда вы начнете добавлять сторонние расширения и любые настройки, которые вы, возможно, добавили в вашу установку. Zend тестировал Magento в версии PHP 7, и я был бы удивлен, если бы были какие-либо серьезные проблемы, хотя не так, что может быть много мелких проблем. На складе 1.9.2 начинается тестирование ....
Брайан 'BJ' Хоффпауир младший
Хорошее объяснение Fabian..thx
Амит Бера
2
Я тестировал Magento 1.9CE на бета-версии php7, это очень важно для админ-панели ... Задачи каталога и т. Д. Выполняются очень быстро. В магазине 3000 товаров страница администрирования списка каталогов изменилась с загрузки 12 с (php5-fpm) до 3,5 с (php7-fpm). Мы стремимся использовать это в работе, поэтому я использую nginx для маршрутизации трафика URL-адреса администратора через php7, и пока поддерживаю фронтальный трафик на php5-fpm. Впрочем, рад за выпуск php7 :)
Рикки Один Мэттьюс
@RickyOdinMatthews Как это работает для вас? Все еще работает админ только на php7? Есть вопросы? Не могли бы вы поделиться частью конфигурации NGINX, которая направляет администратора на php7?
Оттонет
1
@ Ottonet да, все еще использую это на администраторе. Я поместил здесь свою конф-выдержку «по умолчанию» pastebin.com/9z1U94ug
Рики Один Мэтьюз
13

Не комментируйте Magento 1, но у Magento 2 действительно были проблемы с именами классов, такими как «String». Это не заняло много времени, чтобы исправить, но это не сработало из коробки. Я ожидаю, что Magento 2 будет исправлен, но он может быть еще не исправлен из-за других приоритетов в первую очередь.

Алан Кент
источник
1
Спасибо Алану за информацию. Для справки: это проблема Github: github.com/magento/magento2/issues/1367 (другие зарезервированные слова, такие как «объект», как кажется)
Фабиан Шменглер,
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.

Если кто-то заинтересован в решении, его можно найти здесь .

Zsolti
источник
1
Конечно, кто-то заинтересован в решении ;-) Можете ли вы подвести итог содержанию связанной статьи? Нет ничего плохого в том, чтобы связать ваш блог с дополнительной информацией, но ответ должен быть в состоянии стоять самостоятельно.
Фабиан Шменглер
Вопрос в том, готов ли Magento к PHP 7, а не о том, как заставить их работать вместе. Во всяком случае, я обновил свой ответ с кратким решением.
Жолти
1
Похожая ошибка возникает в Varien_File_Uploader, см. Magento.stackexchange.com/questions/93066/…
Фабиан Шменглер
То же самое для 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. В настоящее время я нашел несколько мест, где код должен был потерпеть неудачу из-за единого синтаксиса переменных.

Файл: приложение / код / ​​ядро ​​/ Mage / ImportExport / модель / экспорт / сущность / продукт / тип / Abstract.php

Метод: переопределить атрибут

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

Файл: приложение / код / ​​core / Mage / ImportExport / Model / Export / Entity / Customer.php

Метод: filterAttributeCollection

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

Файл: app / code / core / Mage / ImportExport / Model / Import / Uploader.php

Метод: _validateFile

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

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

Метод: назначить

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

Файл: приложение / код / ​​ядро ​​/ Маг / Каталог / Модель / Продукт / Ссылка / 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]();
Detzler
источник
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

Я использую Magento 2 CE версии 2.1.4 и работает нормально.

Magento \ приложение \ 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.

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

Краанг Прайм
источник