Magento è pronto per PHP 7?


71

PHP 7 sta raggiungendo lo stato beta e molti test sono in corso al momento. Dato che Magento ha raggiunto lo scorso anno da "funziona solo su PHP 5.3" a "pienamente compatibile con PHP 5.6", vorrei sapere quanto stanno prendendo in considerazione la compatibilità con PHP 7 per Magento 1.xe Magento 2.

Ho trovato questo post di Anna Filina in cui ha riscontrato un problema in Magento 1.9.1 (ancora invariato in 1.9.2), ma dato che Magento 1 non ha test unitari, non mi fido che questo fosse l'unico problema.

Quindi la domanda è: sarà garantita la compatibilità con PHP 7 per Magento 1? E poiché Magento 2 probabilmente è già stato testato su PHP 7 (Grazie ai test automatici!), Ci sono problemi noti?


Ho appena provato Magento 2.1.2 su PHP7 ed è un no go.
guru1,

@ guru1 Puoi spiegarci, perché? Nella mia esperienza, funziona bene.
Fabian Schmengler,

@guru ... Sto sviluppando il mio progetto in magento 2.1.2 su php 7 e funziona bene. Quale problema stai affrontando?
Jai,

Risposte:



26

Se stai usando la versione più recente, M CE 1.9.2.2, c'è un'estensione che la porterà alla piena compatibilità con PHP 7: https://github.com/Inchoo/Inchoo_PHP7 . (Dichiarazione di non responsabilità: sono l'autore, anche se c'è molto aiuto da parte della comunità.)

È inoltre installabile tramite Composer da http://packages.firegento.com/ .

Tutte le incompatibilità menzionate qui sono state risolte. Pensiamo che potrebbero esserci ancora alcuni casi limite, ma nulla di straordinario. Sono benvenuti test, segnalazioni di problemi e richieste pull.


è una pessima idea mettere alcune sostituzioni locali ...
MagenX

2
@MagenX a meno che tu non sia Inchoo e sappia cosa stai facendo;)
7

facciamo tutti cose stupide, di tanto in tanto .....
MagenX

2
Il rischio più grande con le sostituzioni locali è usarle con una versione incompatibile di magento, dall'aspetto dell'autore mantiene l'estensione aggiornata con l'ultima versione di magento. E se sei su una versione precedente di magento, giocare con PHP7 è ... Inoltre, seguire ciecamente le migliori pratiche è anche stupido, ci sono situazioni in cui vale la pena "romperle". Penso che sia solo un altro esempio di approccio "cult cult". A proposito, l'estensione è fantastica :)
grizwako,

L'unico problema che ho qui è il supporto delle mod. Non sappiamo mai cosa vorranno usare i nostri clienti quando si tratta di mod e dover testare / aggiornare ogni mod per essere compatibile con php 7 è un incubo.
Bill Garrison,

21

Non ho idea di PHP7, ma immagino che la maggior parte delle cose sia ancora valida in PHP7, puoi trovare maggiori informazioni nel blog di Matthias Geniar

  • ext / mysql: nonostante sia un'estensione MySQL molto vecchia, ritengo che sia ancora molto usato, ma è ora che tutti passino a pdo_mysql.
  • set_magic_quotes_runtimee magic_quotes_runtime: sembra che abbia visto queste note di deprecazione da ... per sempre?
  • iconv.input_encoding, iconv.output_encoding: finora, non ho mai avuto un uso per questi ...
  • #commenti di stile nei file ini: evviva per coerenza, ho sempre preferito; (punto e virgola) commenti in file .ini!
  • preg_replace()modificatore eval: evviva i sysadmins attenti alla sicurezza!

Penso che l'unica cosa che potremmo avere in Magento sia l' preg_replace()eval modificatore, ma speriamo di no.

Oltre a questo, Magento ha spedito 1.9.2 con un TAF aggiornato, che puoi trovare in dev. Con questo dovresti essere in grado di eseguire un sacco di test frontend su PHP7 ed esaminare successivamente il registro


1
Facendo eco al punto di Fabian, la soluzione migliore da testare è iniziare con un'installazione pulita 1.9.2, caricare i dati di esempio, quindi eseguire i test TAF. Indubbiamente ci saranno alcune cose che generano errori o si rompono, e probabilmente anche di più quando inizi ad aggiungere estensioni di terze parti e qualsiasi personalizzazione che potresti aver aggiunto alla tua installazione. Zend aveva testato Magento sulla versione di PHP 7 e sarei sorpreso se ci fossero NESSUNI problemi importanti, sebbene non che ci possano essere MOLTI problemi minori. Lo stock 1.9.2 è il posto dove iniziare i test ....
Bryan 'BJ' Hoffpauir Jr.

Buona spiegazione Fabian..thx
Amit Bera

2
Ho testato Magento 1.9CE su php7 beta, fa una differenza così grande per il pannello di amministrazione ... Le attività del catalogo ecc. Sono così veloci. In un negozio di prodotti 3000, la pagina di amministrazione dell'elenco catalogo è passata dal caricamento in 12 secondi (php5-fpm) a 3,5s (php7-fpm). Siamo desiderosi di utilizzarlo in produzione, quindi sto usando nginx per instradare il traffico dell'URL di amministrazione tramite php7, e per ora mantengo il traffico frontale su php5-fpm. Entusiasta del rilascio di php7, però :)
Ricky Odin Matthews,

@RickyOdinMatthews Come funziona questo per te? Esegui ancora admin solo su php7? Problemi? Potresti condividere la parte della configurazione di NGINX che indirizza admin a php7?
Ottonet,

1
@Ottonet sì, ancora utilizzandolo su admin. Ho inserito qui il mio estratto di configurazione "predefinito" pastebin.com/9z1U94ug
Ricky Odin Matthews,

13

Nessun commento su Magento 1, ma Magento 2 ha avuto dei problemi con i nomi di classe come "String". Non ci è voluto molto tempo per risolvere, ma non ha funzionato fuori dalla scatola. Mi aspetto che Magento 2 verrà risolto, ma potrebbe non essere stato risolto a causa di altre priorità prima.


1
Grazie Alan per le informazioni. Per riferimento, questo è il problema di Github: github.com/magento/magento2/issues/1367 (ancora altre parole riservate come "oggetto" come sembra)
Fabian Schmengler,

3
Stato attuale: nomi delle classi risolti nel ramo di sviluppo, problemi non più noti
Fabian Schmengler,

10

È quasi pronto. Ho provato a eseguire un Magento pulito 1.9.2.1 con PHP 7 RC1, che ha provocato un arresto immediato (errore fatale) di Magento. Dopo aver risolto questo problema, tutto sembrava funzionare, tranne il back-end, al quale non ero in grado di accedere. Successivamente si è rivelato essere un problema relativo alla sessione che può essere corretto.

Brevemente:

  1. L'errore irreversibile può essere corretto sovrascrivendo Mage_Core_Model_Layoute cambiando la riga 555 da:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    in
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. Il problema della sessione temporanea può essere risolto eseguendo l'override Mage_Core_Model_Session_Abstract_Variene riscrivendo il getData, setData, unsetData, addFullNamesi metodi, così ovunque in cui $this->_dataè stato utilizzato, esso sarà sostituito da $_SESSION.

Se qualcuno è interessato alla soluzione, può essere trovata qui .


1
Naturalmente qualcuno è interessato alla soluzione ;-) Puoi riassumere il contenuto dell'articolo collegato? Non c'è niente di sbagliato nel collegare il tuo blog con informazioni aggiuntive, ma la risposta dovrebbe essere in grado di resistere da sola.
Fabian Schmengler,

Bene, la domanda era se Magento è pronto per PHP 7, non su come farli lavorare insieme. Comunque, ho aggiornato la mia risposta con una breve soluzione.
Zsolti,

1
Un errore simile si verifica in Varien_File_Uploader, vedi magento.stackexchange.com/questions/93066/…
Fabian Schmengler

Lo stesso per 1.9.2.4
lrkwz,

8

Magento2 è pronto per PHP 7. L'adattamento del codice a PHP7 è stato fatto e tutte le modifiche sono disponibili nel ramo di sviluppo. Vedi il problema su GitHub

Inoltre, il supporto di php 7 in Magento1 richiede modifiche incompatibili all'indietro e penso che non saranno supportate ufficialmente.


è assolutamente sorprendente che M2 e PHP 7 usciranno nello stesso mese - novembre 2015!
FireBear,

7

C'è un problema con il modo in cui Magento calcola il totale degli ordini e applica gli sconti. Questo sta anche bloccando il pagamento express di Paypal, poiché gli elementi pubblicitari non si sommano al totale generale con lo sconto.

Il problema sembra essere che Mage_Sales_Model_Config_Ordered::_compareTotals()non funziona allo stesso modo in PHP7 come in PHP5 e uasort()ora si basa su una relazione transitiva per l'ordinamento, ma questo non deve essere per i totali dell'ordine.

Prova a usare: -

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

Eccellente, inchiodato il mio strano + 20% di tasse sul totale complessivo.
Evensis,

6

Questa è la mia ricerca che voglio condividere con te sulle incompatibilità di magento php7. Attualmente ho trovato alcuni posti in cui il codice dovrebbe fallire a causa della sintassi variabile uniforme.

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

Metodo: overrideAttribute

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

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

Metodo: filterAttributeCollection

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

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

Metodo: _validateFile

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

File: app / code / core / Mage / Catalog / Model / Product / Link / Api / V2.php

Metodo: assegnare

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

File: app / code / core / Mage / Catalog / Model / Product / Link / Api / V2.php

Metodo: aggiornamento

$data->$attribute['code']

File: lib / Varien / File / Uploader.php

Metodo: _validateFile

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

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

Metodo: getOutput

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

5

Oltre alle altre risposte relative a Magento 1:

Zend_XmlRpc_ServerUn'incompatibilità di PHP 7 in è stata corretta in Zend Framework 1.12.12

Tutte le versioni precedenti a CE 1.9.2.2 / EE 1.14.2.2 utilizzano una versione precedente di Zend Framework, quindi potrebbero avere problemi se si utilizza l'API XML-RPC di Magento.



1

Sto usando Magento 2 CE versione 2.1.4 e funziona benissimo.

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

La risposta breve è no, non lo è. Magento CE 1.9.2.4 supporta ufficialmente solo PHP 5.4 e 5.5. E mentre PHP 5.6 lo esegue bene, satura i file di registro con una moltitudine di messaggi di avviso.

La risposta lunga è che è relativamente facile modificarlo per eseguire il supporto PHP7. Tuttavia, molte estensioni non sono ancora compatibili con PHP7, quindi sei in gran parte da solo.


0

PHP 7.0 è Fine vita a partire dalla prima settimana di dicembre 2018.

A partire da questo post, l'attuale versione di Magento 2.2.3 (versione del 20 febbraio 2018) non supporta PHP 7.1 o PHP 7.2.

Puoi confermare le versioni supportate controllando app/bootstrap.phpnella cartella di installazione di Magento e cercare un codice simile al seguente:

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

Sembra anche che ci siano problemi in .htaccesscui causano 500 errori con apache 2.4.

Inoltre, il file del compositore incluso contiene solo dipendenze per php5.5

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.