Ist Magento bereit für PHP 7?


71

PHP 7 erreicht den Beta-Status und es werden derzeit viele Tests durchgeführt. Da Magento im letzten Jahr von "läuft nur mit PHP 5.3" zu "voll kompatibel mit PHP 5.6" aufgeholt hat, würde ich gerne wissen, wie sehr man PHP 7-Kompatibilität für Magento 1.x sowie für Magento 2 in Betracht zieht.

Ich habe diesen Beitrag von Anna Filina gefunden, wo sie eine Ausgabe in Magento 1.9.1 gefunden hat (in 1.9.2 immer noch unverändert), aber da Magento 1 keine Komponententests hat, vertraue ich nicht darauf, dass dies die einzige Ausgabe war.

Die Frage ist also: Wird die PHP 7-Kompatibilität für Magento 1 gewährleistet sein? Und da Magento 2 wahrscheinlich bereits auf PHP 7 getestet wurde (Dank automatisierter Tests!), Gibt es bekannte Probleme?


Ich habe gerade Magento 2.1.2 auf PHP7 ausprobiert und es ist ein No-Go.
Guru1

@ guru1 Kannst du näher erläutern, warum? Nach meiner Erfahrung funktioniert es gut.
Fabian Schmengler

@guru ... Ich entwickle mein Projekt in Magento 2.1.2 auf PHP 7 und es funktioniert einwandfrei. Welches Problem haben Sie?
Jai

Antworten:



26

Wenn Sie die neueste Version, M CE 1.9.2.2, verwenden, gibt es eine Erweiterung, die die vollständige PHP 7-Kompatibilität gewährleistet: https://github.com/Inchoo/Inchoo_PHP7 . (Haftungsausschluss: Ich bin der Autor, obwohl die Community sehr hilfreich ist.)

Es kann auch über Composer unter http://packages.firegento.com/ installiert werden .

Alle hier genannten Inkompatibilitäten sind behoben. Wir glauben, dass es immer noch ein paar Randfälle gibt, aber nichts, was aufhalten könnte. Tests, Fehlerberichte und Pull-Anfragen sind willkommen.


Es ist eine sehr schlechte Idee, einige lokale Überschreibungen zu setzen ...
MagenX

2
@MagenX es sei denn, Sie Inchoo und wissen, was Sie tun;)
7ochem

wir alle tun dumme Dinge, von Zeit zu Zeit .....
MagenX

2
Das größte Risiko bei lokalen Überschreibungen besteht darin, dass sie mit einer inkompatiblen Version von Magento verwendet werden. Der Autor hält die Erweiterung mit der neuesten Magento-Version auf dem neuesten Stand. Und wenn Sie mit einer älteren Version von Magento arbeiten, ist das Spielen mit PHP7 ... Auch das blinde Befolgen von Best Practices ist dumm. Es gibt Situationen, in denen es sich lohnt, diese zu "brechen". Ich denke, es ist nur ein weiteres Beispiel für einen "Frachtkult" -Ansatz. Übrigens ist die Erweiterung fantastisch :)
Grizwako

Das einzige Problem, das ich hier habe, ist die Unterstützung von Mods. Wir wissen nie, was unsere Kunden in Bezug auf Mods verwenden wollen und es ist ein Alptraum, jeden Mod testen / upgraden zu müssen, um mit PHP 7 kompatibel zu sein.
Bill Garrison

21

Keine Ahnung von PHP7, aber ich denke, das meiste Zeug ist immer noch in PHP7 gültig. Weitere Informationen finden Sie im Blog von Matthias Geniar

  • ext / mysql: Obwohl es sich um eine sehr alte MySQL-Erweiterung handelt, würde ich davon ausgehen, dass sie immer noch sehr verbreitet ist, aber es ist an der Zeit, dass alle nach pdo_mysql ziehen.
  • set_magic_quotes_runtimeund magic_quotes_runtime: anscheinend habe ich diese verfallserklärungen seit ... für immer gesehen?
  • iconv.input_encoding, iconv.output_encoding: So weit, ich habe noch nie eine Verwendung für diese hatte ...
  • #Stilkommentare in INI- Dateien: Hurra für die Konsistenz, ich habe es immer vorgezogen; (Semikolon) Kommentare in .ini-Dateien!
  • preg_replace()eval modifier: Hurra für sicherheitsbewusste Sysadmins!

Ich denke, das Einzige, was wir in Magento haben könnten, ist preg_replace()eval modifier, aber hoffentlich nicht.

Außerdem hat Magento 1.9.2 mit einer aktualisierten TAF ausgeliefert, die Sie in dev finden können. Damit sollten Sie in der Lage sein, eine Reihe von Frontend-Tests auf PHP7 durchzuführen und anschließend das Protokoll zu untersuchen


1
In Anlehnung an Fabians Argument ist es am besten, mit einer sauberen 1.9.2-Installation zu beginnen, die Beispieldaten zu laden und dann die TAF-Tests durchzuführen. Es wird zweifellos einige Dinge geben, die Fehler auslösen oder brechen, und wahrscheinlich noch mehr, wenn Sie damit beginnen, Erweiterungen von Drittanbietern und Anpassungen hinzuzufügen, die Sie möglicherweise zu Ihrer Installation hinzugefügt haben. Zend hatte Magento in der PHP 7-Version getestet und ich wäre überrascht, wenn es ALLE größeren Probleme gäbe, aber nicht, dass es VIELE kleinere Probleme geben könnte. Stock 1.9.2 ist der Ort, um mit dem Testen zu beginnen ....
Bryan 'BJ' Hoffpauir Jr.

Gute Erklärung Fabian..thx
Amit Bera

2
Ich habe Magento 1.9CE auf PHP7 Beta getestet, es macht einen so großen Unterschied für das Admin-Panel ... Katalog-Aufgaben usw. sind so schnell. In einem 3000-Produkte-Shop wurde die Verwaltungsseite für die Katalogliste von 12 Sekunden Laden (php5-fpm) auf 3,5 Sekunden Laden (php7-fpm) geändert. Wir möchten dies gerne in der Produktion verwenden. Daher verwende ich Nginx, um den URL-Verkehr des Administrators über PHP7 weiterzuleiten und den frontseitigen Verkehr vorerst auf PHP5-FPM zu halten. Aufgeregt für die Veröffentlichung von PHP7, obwohl :)
Ricky Odin Matthews

@ RickyOdinMatthews Wie funktioniert das für Sie? Läuft admin immer noch nur auf php7? Irgendwelche Probleme? Könnten Sie den Teil der NGINX-Konfiguration teilen, der den Administrator zu php7 weiterleitet?
Ottonet

1
@Ottonet ja, verwende es immer noch auf admin. Ich habe meinen 'Standard'-Conf-Extrakt für Sie hier eingefügt. Pastebin.com/9z1U94ug
Ricky Odin Matthews

13

Kein Kommentar zu Magento 1, aber Magento 2 hatte einige Probleme mit Klassennamen wie "String". Die Reparatur dauerte nicht lange, funktionierte aber nicht sofort. Ich gehe davon aus, dass Magento 2 repariert wird, aber es kann sein, dass es aufgrund anderer Prioritäten noch nicht repariert wurde.


1
Vielen Dank an Alan für die Info. Als Referenz ist dies die Github-Ausgabe: github.com/magento/magento2/issues/1367 (noch andere reservierte Wörter wie "Objekt", wie es scheint)
Fabian Schmengler

3
Aktueller Status: Klassennamen in Entwicklungszweig behoben, keine bekannteren Probleme
Fabian Schmengler

10

Es ist fast fertig. Ich habe versucht, ein sauberes Magento 1.9.2.1 mit PHP 7 RC1 auszuführen, was zu einem sofortigen Absturz (schwerwiegender Fehler) von Magento führte. Nachdem dieses Problem behoben wurde, schien alles zu funktionieren, mit Ausnahme des Backends, bei dem ich mich nicht einloggen konnte. Später stellte sich heraus, dass es sich um ein sitzungsbezogenes Problem handelte, das behoben werden kann.

Kurz:

  1. Der schwerwiegende Fehler kann behoben werden, indem Mage_Core_Model_LayoutZeile 555 von:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    in geändert wird
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. Die Sitzung Problem kann vorübergehend fixiert wird durch zwingende Mage_Core_Model_Session_Abstract_Varienund das Umschreiben getData, setData, unsetData, addFullNamesMethoden, so überall dort , wo $this->_dataverwendet wurde, wird es ersetzt durch $_SESSION.

Wenn sich jemand für die Lösung interessiert, finden Sie sie hier .


1
Natürlich interessiert sich jemand für die Lösung ;-) Können Sie den Inhalt des verlinkten Artikels zusammenfassen? Es ist nichts Falsches daran, Ihr Blog mit zusätzlichen Informationen zu verknüpfen, aber die Antwort sollte für sich allein stehen können.
Fabian Schmengler

Nun, die Frage war, ob Magento für PHP 7 bereit ist, und nicht, wie man sie zusammenarbeitet. Jedenfalls habe ich meine Antwort mit einer kurzen Lösung aktualisiert.
Zsolti,

1
Ein ähnlicher Fehler tritt bei auf Varien_File_Uploader, siehe magento.stackexchange.com/questions/93066/…
Fabian Schmengler

Gleiches gilt für 1.9.2.4
lrkwz

8

Magento2 ist bereit für PHP 7. Die Anpassung des Codes an PHP7 wurde vorgenommen und alle Änderungen sind im Entwicklungszweig verfügbar. Siehe Ausgabe auf GitHub

Außerdem erfordert die Unterstützung von PHP 7 in Magento1 inkompatible Änderungen abwärts und ich denke, dass dies nicht offiziell unterstützt wird.


Es ist erstaunlich, dass M2 und PHP 7 im selben Monat - November 2015 - veröffentlicht werden!
FireBear

7

Es gibt ein Problem damit, wie Magento die Gesamtsumme der Bestellung berechnet und die Rabatte anwendet. Dies stoppt auch die Paypal Express-Kaufabwicklung, da die Werbebuchungen nicht zur Gesamtsumme mit dem Rabatt addieren.

Das Problem scheint zu sein, dass das Mage_Sales_Model_Config_Ordered::_compareTotals()in PHP7 nicht wie in PHP5 funktioniert und uasort()sich nun auf die transitiven Beziehungen für die Bestellung stützt, dies muss jedoch nicht für die Bestellsummen gelten.

Versuchen Sie es mit: -

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

Ausgezeichnet, meine komische + 20% Steueraufstockung auf die Gesamtsumme genagelt.
Evensis

6

Dies ist meine Forschung, die ich mit Ihnen über die Inkompatibilitäten von Magento Php7 teilen möchte. Derzeit habe ich einige Stellen gefunden, an denen der Code aufgrund einer einheitlichen Variablensyntax fehlschlagen sollte.

Datei: app / code / core / Mage / ImportExport / Model / Export / Entity / Product / Type / Abstract.php

Methode: overrideAttribute

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

Datei: app / code / core / Mage / ImportExport / Model / Export / Entity / Customer.php

Methode: filterAttributeCollection

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

Datei: app / code / core / Mage / ImportExport / Model / Import / Uploader.php

Methode: _validateFile

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

Datei: app / code / core / Mage / Katalog / Modell / Produkt / Link / Api / V2.php

Methode: zuweisen

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

Datei: app / code / core / Mage / Katalog / Modell / Produkt / Link / Api / V2.php

Methode: aktualisieren

$data->$attribute['code']

Datei: lib / Varien / File / Uploader.php

Methode: _validateFile

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

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

Methode: getOutput

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

5

Zusätzlich zu den anderen Antworten zu Magento 1:

Eine PHP 7 Inkompatibilität in Zend_XmlRpc_Serverwurde in Zend Framework 1.12.12 behoben

Alle Versionen vor CE 1.9.2.2 / EE 1.14.2.2 verwenden eine ältere Version von Zend Framework. Daher können Probleme auftreten, wenn Sie die XML-RPC-API von Magento verwenden.



1

Ich benutze Magento 2 CE Version 2.1.4 & Funktioniert einwandfrei.

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

Kurze Antwort ist nein, tut es nicht. Magento CE 1.9.2.4 unterstützt nur PHP 5.4 und 5.5 offiziell. Und während PHP 5.6 es einwandfrei ausführt, sättigt es Protokolldateien mit einer Vielzahl von Warnmeldungen.

Lange Antwort ist, dass es relativ einfach ist, es so zu ändern, dass es PHP7 unterstützt. Viele Erweiterungen sind jedoch immer noch nicht PHP7-kompatibel, sodass Sie weitgehend alleine sind.


0

PHP 7.0 ist das Ende der Laufzeit ab der ersten Dezemberwoche 2018.

Ab diesem Beitrag unterstützt die aktuelle Version von Magento 2.2.3 (Release vom 20. Februar 2018) weder PHP 7.1 noch PHP 7.2.

Sie können die unterstützten Versionen überprüfen, indem Sie app/bootstrap.phpin Ihrem Magento-Installationsordner nach folgendem Code suchen:

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

Es scheint auch Probleme zu geben, bei .htaccessdenen Apache 2.4 500 Fehler verursacht.

Darüber hinaus enthält die enthaltene Composer-Datei nur Abhängigkeiten für PHP 5.5

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.