¿Magento está listo para PHP 7?

71

PHP 7 está alcanzando el estado beta y se están realizando muchas pruebas en este momento. Dado que Magento se puso al día en el último año desde "ejecuta solo en PHP 5.3" hasta "totalmente compatible con PHP 5.6", me gustaría saber cuánto están considerando la compatibilidad de PHP 7 para Magento 1.x y Magento 2.

Encontré esta publicación de Anna Filina donde encontró un problema en Magento 1.9.1 (aún sin cambios en 1.9.2), pero dado que Magento 1 no tiene pruebas unitarias, no confío en que este sea el único problema.

Entonces la pregunta es: ¿se garantizará la compatibilidad de PHP 7 para Magento 1? Y como Magento 2 probablemente ya ha sido probado en PHP 7 (¡Gracias a las pruebas automatizadas!), ¿Hay algún problema conocido?

Fabian Schmengler
fuente
Acabo de probar magento 2.1.2 en php7 y no es posible.
guru1
@ guru1 ¿Puedes explicarme por qué? En mi experiencia, funciona bien.
Fabian Schmengler
@guru ... Estoy desarrollando mi proyecto en magento 2.1.2 en php 7 y está funcionando bien. ¿Qué problema enfrentas?
Jai

Respuestas:

26

Si está utilizando la versión más reciente, M CE 1.9.2.2, hay una extensión que lo llevará a la compatibilidad completa con PHP 7: https://github.com/Inchoo/Inchoo_PHP7 . (Descargo de responsabilidad: soy el autor, aunque hay mucha ayuda de la comunidad).

También se puede instalar a través de Composer desde http://packages.firegento.com/ .

Todas las incompatibilidades mencionadas aquí son fijas. Creemos que todavía puede haber algunos casos extremos, pero nada que parezca espectacular. Pruebas, informes de problemas y solicitudes de extracción son bienvenidos.

Ivan Čurdinjaković
fuente
es una muy mala idea poner algunas anulaciones locales ...
MagenX
2
@MagenX a menos que sea Inchoo y sepa lo que está haciendo;)
7ochem
todos hacemos cosas estúpidas, de vez en cuando .....
MagenX
2
El mayor riesgo con las anulaciones locales es usarlas con una versión incompatible de magento, por lo que parece, el autor mantiene la extensión actualizada con la última versión de magento. Y si estás en una versión anterior de magento, jugar con PHP7 es ... Además, seguir ciegamente las mejores prácticas también es estúpido, hay situaciones en las que vale la pena "romperlas". Creo que es solo un ejemplo más del enfoque de "culto a la carga". Por cierto, la extensión es increíble :)
grizwako
El único problema que tengo aquí es el soporte de mods. Nunca sabemos lo que nuestros clientes querrán usar cuando se trata de modificaciones y tener que probar / actualizar cada modificación para que sea compatible con php 7 es una pesadilla.
Bill Garrison
21

No tengo idea sobre PHP7, pero supongo que la mayoría de las cosas aún son válidas en PHP7, puedes encontrar más información en el blog de Matthias Geniar

  • ext / mysql: a pesar de ser una extensión MySQL muy antigua, creo que todavía es muy utilizada, pero es hora de que todos pasen a pdo_mysql.
  • set_magic_quotes_runtimey magic_quotes_runtime: parece que he visto estos avisos de desaprobación desde ... ¿para siempre?
  • iconv.input_encoding, iconv.output_encoding: hasta ahora, nunca he tenido un uso para estos ...
  • #comentarios de estilo en archivos ini: hurra por coherencia, siempre he preferido; (punto y coma) comentarios en archivos .ini!
  • preg_replace()modificador eval: ¡ hurra por los administradores de sistemas con mentalidad de seguridad!

Creo que lo único que podríamos tener en Magento es el preg_replace()modificador eval pero espero que no.

Además de esto, Magento envió 1.9.2 con un TAF actualizado, que puede encontrar en dev. Con esto, debería poder ejecutar un montón de pruebas frontend en PHP7 y examinar el registro después

Fabian Blechschmidt
fuente
1
Haciéndose eco del punto de Fabian, su mejor opción para probar es comenzar con una instalación limpia 1.9.2, cargar los datos de muestra y luego ejecutar las pruebas TAF. Sin duda, habrá algunas cosas que arrojarán errores o se romperán, y probablemente aún más cuando comience a agregar Extensiones de terceros y cualquier personalización que haya agregado a su instalación. Zend había estado probando Magento en el lanzamiento de PHP 7 y me sorprendería si hubiera CUALQUIER problema importante, aunque no es que haya MUCHOS problemas menores. Stock 1.9.2 es el lugar para comenzar a probar ...
Bryan 'BJ' Hoffpauir Jr.
Buena explicación Fabian..thx
Amit Bera
2
He estado probando Magento 1.9CE en php7 beta, hace una gran diferencia para el panel de administración ... Las tareas de catálogo, etc. son muy rápidas. En una tienda de productos 3000, la página de administración de la lista del catálogo pasó de cargar 12s (php5-fpm) a 3.5s (php7-fpm). Estamos ansiosos por usar esto en producción, por lo que estoy usando nginx para enrutar el tráfico de la URL del administrador a través de php7, y mantener el tráfico frontal en php5-fpm por ahora. Emocionado por el lanzamiento de php7, sin embargo :)
Ricky Odin Matthews
@RickyOdinMatthews ¿Cómo te está yendo esto? ¿Sigue ejecutando admin solo en php7? ¿Cualquier problema? ¿Podría compartir la parte de la configuración de NGINX que enruta al administrador a php7?
Ottonet
1
@Ottonet sí, todavía lo uso en admin. He puesto aquí mi extracto de configuración 'predeterminado' pastebin.com/9z1U94ug
Ricky Odin Matthews
13

No hay comentarios sobre Magento 1, pero Magento 2 tuvo algunos problemas con los nombres de clase como "String". No tardó mucho en solucionarlo, pero no funcionó de fábrica. Espero que Magento 2 se arregle, pero es posible que aún no se arregle debido a otras prioridades primero.

Alan Kent
fuente
1
Thans Alan por la información. Como referencia, este es el tema de Github: github.com/magento/magento2/issues/1367 (aún otras palabras reservadas como "objeto" como parece)
Fabian Schmengler
3
Estado actual: nombres de clase corregidos en la rama de desarrollo, no más problemas conocidos
Fabian Schmengler
10

Está casi listo Intenté ejecutar un Magento 1.9.2.1 limpio con PHP 7 RC1, lo que resultó en un bloqueo instantáneo (error fatal) de Magento. Después de solucionar este problema, todo parecía funcionar, excepto el backend, en el que no pude iniciar sesión. Más tarde resultó ser un problema relacionado con la sesión que puede ser parcheado.

Brevemente:

  1. El error fatal se puede solucionar anulando y Mage_Core_Model_Layoutluego cambiando la línea 555 de:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    a
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. El problema sesión de forma temporal puede fijarse por razones imperiosas Mage_Core_Model_Session_Abstract_Varieny reescribir el getData, setData, unsetData, addFullNamesmétodos, por lo que en todas partes donde $this->_datase utilizó, que serán reemplazados por $_SESSION.

Si alguien está interesado en la solución, puede encontrarla aquí .

Zsolti
fuente
1
Por supuesto, alguien está interesado en la solución ;-) ¿Puede resumir el contenido del artículo vinculado? No hay nada de malo en vincular su blog con información adicional, pero la respuesta debería ser independiente.
Fabian Schmengler
Bueno, la pregunta era si Magento está listo para PHP 7, no sobre cómo hacer que funcionen juntos. De todos modos, he actualizado mi respuesta con una breve solución.
Zsolti
1
Se produce un error similar en Varien_File_Uploader, consulte magento.stackexchange.com/questions/93066/…
Fabian Schmengler
Lo mismo para 1.9.2.4
lrkwz
8

Magento2 está listo para PHP 7. Se realizó la adaptación del código a PHP7 y todos los cambios están disponibles en la rama de desarrollo. Ver problema en GitHub

Además, el soporte de php 7 en Magento1 requiere cambios incompatibles con versiones anteriores y creo que no será compatible oficialmente.

Kandy
fuente
¡Es increíble que M2 y PHP 7 se lancen en el mismo mes, noviembre de 2015!
FireBear
7

Hay un problema con la forma en que Magento calcula el total general de la orden y aplica los descuentos. Esto también detiene el pago rápido de Paypal, ya que las líneas de pedido no se suman al total general con el descuento.

El problema parece ser que Mage_Sales_Model_Config_Ordered::_compareTotals()no funciona igual en PHP7 que PHP5, y uasort()ahora depende de una relación transitiva para el pedido, pero esto no tiene que ser para los totales de pedidos.

Intenta usar: -

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
fuente
Excelente, clavó mi extraño + 20% de recarga de impuestos sobre el total general.
evensis
6

Esta es mi investigación que quiero compartir con ustedes sobre las incompatibilidades con magento php7. Actualmente he encontrado algunos lugares donde el código debería fallar debido a la sintaxis variable uniforme.

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

Método: overrideAttribute

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

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

Método: filterAttributeCollection

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

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

Método: _validateFile

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

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

Método: asignar

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

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

Método: actualización

$data->$attribute['code']

Archivo: lib / Varien / File / Uploader.php

Método: _validateFile

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

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

Método: getOutput

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

Además de las otras respuestas relacionadas con Magento 1:

Se Zend_XmlRpc_Serverha corregido una incompatibilidad PHP 7 en Zend Framework 1.12.12

Todas las versiones anteriores a CE 1.9.2.2 / EE 1.14.2.2 usan una versión anterior de Zend Framework, por lo que podrían tener problemas si usa la API XML-RPC de Magento.

Fabian Schmengler
fuente
1

Estoy usando Magento 2 CE versión 2.1.4 y funciona 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
fuente
1

La respuesta corta es no, no lo hace. Magento CE 1.9.2.4 solo es compatible con PHP 5.4 y 5.5 oficialmente. Y aunque PHP 5.6 lo ejecuta bien, satura los archivos de registro con multitud de mensajes de advertencia.

La respuesta larga es que es relativamente fácil modificarlo para ejecutar el soporte PHP7. Sin embargo, muchas extensiones aún no son compatibles con PHP7, por lo que en gran medida está solo.

Sheshgiri Anvekar
fuente
0

PHP 7.0 finaliza a partir de la primera semana de diciembre de 2018.

A partir de esta publicación, la versión actual de Magento 2.2.3 (versión del 20 de febrero de 2018) no es compatible con PHP 7.1 o PHP 7.2.

Puede confirmar las versiones compatibles al ingresar app/bootstrap.phpa su carpeta de instalación de Magento y buscar un código similar al siguiente:

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

También parece haber problemas en los .htaccessque se producen 500 errores con apache 2.4.

Además, el archivo del compositor incluido solo contiene dependencias para php5.5

Kraang Prime
fuente