Magento est-il prêt pour PHP 7?

71

PHP 7 atteint le statut de bêta et de nombreux tests sont en cours. Étant donné que Magento a rattrapé son retard de "fonctionne uniquement sur PHP 5.3" à "entièrement compatible avec PHP 5.6", j'aimerais savoir à quel point ils envisagent la compatibilité de PHP 7 pour Magento 1.x ainsi que Magento 2.

J'ai trouvé ce billet d'Anna Filina où elle a trouvé un problème dans Magento 1.9.1 (inchangé dans la version 1.9.2), mais étant donné que Magento 1 ne comporte pas de tests unitaires, je ne pense pas qu'il s'agisse du seul problème.

La question est donc la suivante: la compatibilité de PHP 7 avec Magento 1 sera-t-elle assurée? Et comme Magento 2 a probablement déjà été testé sur PHP 7 (Merci aux tests automatisés!), Existe-t-il des problèmes connus?

Fabian Schmengler
la source
Je viens d'essayer magento 2.1.2 sur php7 et c'est un non-aller.
Guru1
@ guru1 Pouvez-vous élaborer, pourquoi? D'après mon expérience, cela fonctionne bien.
Fabian Schmengler
@guru ... Je développe mon projet dans magento 2.1.2 sur php 7 et ça fonctionne bien. À quel problème êtes-vous confronté?
Jai

Réponses:

26

Si vous utilisez la version la plus récente, M CE 1.9.2.2, il existe une extension qui apportera la compatibilité totale à PHP 7: https://github.com/Inchoo/Inchoo_PHP7 . (Avertissement: je suis l'auteur, même s'il y a beaucoup d'aide de la part de la communauté.)

Il est également installable via Composer à partir de http://packages.firegento.com/ .

Toutes les incompatibilités mentionnées ici sont corrigées. Nous pensons qu'il y a peut-être encore quelques cas critiques, mais rien ne nous arrête. Les tests, les rapports de problème et les demandes d'extraction sont les bienvenus.

Ivan Čurdinjaković
la source
c'est une très mauvaise idée de faire quelques substitutions locales ...
MagenX
2
@MagenX sauf si vous êtes Inchoo et savez ce que vous faites;)
7ochem
nous faisons tous des bêtises, de temps en temps .....
MagenX
2
Le plus grand risque avec des substitutions locales est de les utiliser avec une version incompatible de magento. D'après son apparence, l'auteur tient l'extension à jour avec la dernière version de magento. Et si vous utilisez une version antérieure de magento, jouer avec PHP7 est ... De plus, suivre aveuglément les meilleures pratiques est aussi stupide, il existe des situations où il vaut la peine de les "casser". Je pense que ce n'est qu'un exemple de plus de l'approche "culte du fret". Btw, l'extension is awesome :)
grizwako
Le seul problème que j'ai ici est le support des mods. Nous ne savons jamais ce que nos clients voudront utiliser en matière de mods et devoir tester / mettre à jour tous les mods compatibles php 7 est un cauchemar.
Bill Garrison
21

Aucune idée sur PHP7, mais je suppose que la plupart des éléments sont toujours valables en PHP7; vous pouvez trouver plus d'informations dans le blog de Matthias Geniar

  • ext / mysql: bien qu'il s'agisse d'une très ancienne extension MySQL, je pense que son utilisation est encore très répandue, mais il est temps que tout le monde passe à pdo_mysql.
  • set_magic_quotes_runtimeet magic_quotes_runtime: il semble que j'ai vu ces avis de dépréciation depuis ... pour toujours?
  • iconv.input_encoding, iconv.output_encoding: jusqu'à présent, je n'ai jamais eu d'utilisation de ces ...
  • #commentaires de style dans les fichiers ini: bonjour pour la cohérence, j'ai toujours préféré; (point-virgule) des commentaires dans les fichiers .ini!
  • preg_replace()modificateur eval: bravo pour les administrateurs systèmes soucieux de la sécurité!

Je pense que la seule chose que nous pourrions avoir dans Magento est le preg_replace()modificateur eval, mais j'espère que non.

A côté de cela, Magento expédié 1.9.2 avec un TAF mis à jour, vous pouvez trouver dans dev. Avec cela, vous devriez pouvoir exécuter de nombreux tests frontaux sur PHP7 et examiner le journal par la suite.

Fabian Blechschmidt
la source
1
En écho au point de Fabian, le mieux est de commencer par une nouvelle version 1.9.2, de charger les exemples de données, puis de lancer les tests TAF. Il y aura certainement des choses qui jetteront des erreurs ou des bris, et probablement encore plus lorsque vous commencerez à ajouter des extensions tierces et toute personnalisation que vous aurez éventuellement ajoutée à votre installation. Zend avait testé Magento sur la version PHP 7 et je serais surpris qu'il y ait TOUT problème majeur, bien que pas beaucoup de problèmes mineurs. Stock 1.9.2 est l'endroit idéal pour commencer les tests ....
Bryan 'BJ' Hoffpauir Jr.
Bonne explication Fabian..thx
Amit Bera
2
J'ai testé Magento 1.9CE sur la version bêta de php7, cela fait une énorme différence pour le panneau d'administration ... Les tâches de catalogue, etc. sont tellement rapides. Sur un magasin de produits 3000, la page d’administration de la liste des catalogues est passée de 12 s de chargement (php5-fpm) à 3,5 s (php7-fpm). Nous souhaitons utiliser cela en production, aussi j'utilise nginx pour acheminer le trafic des URL d’administrateur via php7, et pour le moment, garder le trafic de face sur php5-fpm. Heureux pour la sortie de php7, cependant :)
Ricky Odin Matthews
@ RickyOdinMatthews Comment cela fonctionne-t-il pour vous? Toujours en cours d'administration uniquement sur php7? Quelque problème que ce soit? Pourriez-vous partager la partie de la configuration de NGINX qui dirige l'administrateur vers php7?
Ottonet
1
@Ottonet oui, toujours l'utiliser sur admin. J'ai mis mon extrait de conf par défaut ici pour vous pastebin.com/9z1U94ug
Ricky Odin Matthews
13

Pas de commentaire sur Magento 1, mais Magento 2 a eu quelques problèmes avec les noms de classe comme "String". Il n'a pas fallu longtemps pour le réparer, mais cela n'a pas fonctionné immédiatement. Je m'attends à ce que Magento 2 soit corrigé, mais il se peut que ce ne soit pas encore le cas en raison d'autres priorités.

Alan Kent
la source
1
Merci Alan pour l'info. Pour référence, voici le numéro de Github: github.com/magento/magento2/issues/1367 (encore d'autres mots réservés tels que "objet" comme il semble)
Fabian Schmengler le
3
Etat actuel: noms de classe corrigés dans la branche develop, pas de problèmes connus
Fabian Schmengler
10

C'est presque prêt. J'ai essayé de lancer un Magento 1.9.2.1 vierge avec PHP 7 RC1, ce qui a provoqué un crash instantané (erreur fatale) de Magento. Après avoir résolu ce problème, tout semblait fonctionner, à l'exception du backend, auquel je ne pouvais pas me connecter. Plus tard, il s’est avéré qu’il s’agissait d’un problème lié à la session qui pouvait être corrigé.

Brièvement:

  1. L'erreur fatale peut être résolu en remplaçant Mage_Core_Model_Layoutpuis en changeant la ligne 555 à partir de :
    $out .= $this->getBlock($callback[0])->$callback[1]();
    en
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. Le problème de la session peut être temporairement fixé en remplaçant Mage_Core_Model_Session_Abstract_Varienet réécrire le getData, setData, unsetData, addFullNamesméthodes, donc partout où $this->_dataa été utilisé, il sera remplacé par $_SESSION.

Si quelqu'un est intéressé par la solution, vous pouvez la trouver ici .

Zsolti
la source
1
Bien sûr, quelqu'un s'intéresse à la solution ;-) Pouvez-vous résumer le contenu de l'article lié? Il n'y a rien de mal à associer votre blog à des informations supplémentaires, mais la réponse doit pouvoir être autonome.
Fabian Schmengler
Eh bien, la question était de savoir si Magento est prêt pour PHP 7, et non de savoir comment les faire fonctionner ensemble. Quoi qu'il en soit, j'ai mis à jour ma réponse avec une solution brève.
Zsolti
1
Une erreur similaire se produit dans Varien_File_Uploader, voir magento.stackexchange.com/questions/93066/…
Fabian Schmengler
Idem pour 1.9.2.4
lrkwz
8

Magento2 est prêt pour PHP 7. L'adaptation du code à PHP7 a été effectuée et toutes les modifications sont disponibles dans la branche develop. Voir le numéro sur GitHub

En outre, la prise en charge de php 7 dans Magento1 nécessite des modifications incompatibles avec les versions antérieures et, à mon avis, ne sera pas prise en charge officiellement.

KAndy
la source
Il est vraiment étonnant que M2 et PHP 7 soient publiés au cours du même mois - novembre 2015!
FireBear
7

Il y a un problème avec la façon dont Magento calcule le total général de la commande et applique les remises. Cela arrête également le paiement express Paypal, car les éléments de campagne ne correspondent pas au total général de la réduction.

Le problème semble être que le Mage_Sales_Model_Config_Ordered::_compareTotals()ne fonctionne pas de la même manière en PHP7 que PHP5, et uasort()repose maintenant sur une relation transitive pour la commande, mais cela ne doit pas forcément être pour le total des commandes.

Essayez d'utiliser: -

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;
}
Dallas Clarke
la source
Excellent, j'ai réussi à ajouter 20% d'impôts sur le total.
evensis
6

Ce sont mes recherches que je veux partager avec vous sur les incompatibilités de magento php7. Actuellement, j'ai trouvé des endroits où le code devrait échouer à cause d'une syntaxe de variable uniforme.

Fichier: app / code / core / Mage / ImportExport / Modèle / Export / Entité / Produit / Type / Abstract.php

Méthode: overrideAttribute

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

Fichier: app / code / core / Mage / ImportExport / Modèle / Export / Entity / Customer.php

Méthode: filterAttributeCollection

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

Fichier: app / code / core / Mage / ImportExport / Modèle / Import / Uploader.php

Méthode: _validateFile

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

Fichier: app / code / core / Mage / Catalogue / Modèle / Produit / Link / Api / V2.php

Méthode: assigner

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

Fichier: app / code / core / Mage / Catalogue / Modèle / Produit / Link / Api / V2.php

Méthode: mise à jour

$data->$attribute['code']

Fichier: lib / Varien / File / Uploader.php

Méthode: _validateFile

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

Fichier: app / code / core / Mage / Core / Model / Layout.php

Méthode: getOutput

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

En plus des autres réponses liées à Magento 1:

Une incompatibilité PHP 7 dans Zend_XmlRpc_Servera été corrigée dans Zend Framework 1.12.12

Toutes les versions antérieures à CE 1.9.2.2 / EE 1.14.2.2 utilisent une version plus ancienne de Zend Framework, des problèmes pourraient donc se poser si vous utilisez l'API XML-RPC de Magento.

Fabian Schmengler
la source
1

J'utilise Magento 2 CE version 2.1.4 et fonctionne bien.

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);
}
Ankit Shah
la source
1

La réponse courte est non, ce n'est pas le cas. Magento CE 1.9.2.4 ne supporte que PHP 5.4 et 5.5 officiellement. Et bien que PHP 5.6 fonctionne correctement, il sature les fichiers journaux avec une multitude de messages d’avertissement.

La réponse longue est qu'il est relativement facile de le modifier pour exécuter le support PHP7. Cependant, de nombreuses extensions ne sont toujours pas compatibles PHP7, vous êtes donc largement autonome.

Sheshgiri Anvekar
la source
0

PHP 7.0 est en fin de vie à partir de la première semaine de décembre 2018.

À compter de cette publication, la version actuelle de Magento 2.2.3 (version du 20 février 2018) ne prend pas en charge PHP 7.1 ni PHP 7.2.

Vous pouvez confirmer les versions prises en charge en consultant app/bootstrap.phpvotre dossier d'installation Magento et rechercher un code similaire à celui-ci:

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

Il semble également y avoir des problèmes dans .htaccesslesquels causer 500 erreurs avec Apache 2.4.

De plus, le fichier de composition inclus ne contient que des dépendances pour php5.5

Kraang Prime
la source