O Magento está pronto para o PHP 7?

71

O PHP 7 está alcançando o status beta e muitos testes estão em andamento no momento. Dado que o Magento alcançou no ano passado de "roda apenas no PHP 5.3" para "totalmente compatível com o PHP 5.6", eu gostaria de saber o quanto eles estão considerando a compatibilidade do PHP 7 com o Magento 1.x e o Magento 2.

Encontrei este post de Anna Filina, onde ela encontrou um problema no Magento 1.9.1 (ainda inalterado no 1.9.2), mas, como o Magento 1 não possui testes de unidade, não acredito que esse seja o único problema.

Portanto, a pergunta é: será garantida a compatibilidade do PHP 7 com o Magento 1? E como o Magento 2 provavelmente já foi testado no PHP 7 (Obrigado por testes automatizados!), Existem problemas conhecidos?

Fabian Schmengler
fonte
Eu apenas tentei o magento 2.1.2 no php7 e não é possível.
guru1
@ guru1 Você pode elaborar, por quê? Na minha experiência, funciona bem.
Fabian Schmengler
@ guru ... Estou desenvolvendo meu projeto no magento 2.1.2 no php 7 e está funcionando bem. Que problema você enfrenta?
Jai

Respostas:

26

Se você estiver usando a versão mais recente, M CE 1.9.2.2, há uma extensão que trará a compatibilidade total com o PHP 7: https://github.com/Inchoo/Inchoo_PHP7 . (Aviso: sou o autor, embora exista muita ajuda da comunidade.)

Também é instalável através do Composer em http://packages.firegento.com/ .

Todas as incompatibilidades mencionadas aqui são corrigidas. Achamos que ainda pode haver alguns casos extremos, mas nada que pare de mostrar. Testes, relatórios de problemas e solicitações pull são bem-vindos.

Ivan Čurdinjaković
fonte
é uma péssima idéia colocar algumas substituições locais ...
MagenX 15/03
2
@MagenX menos que você seja Inchoo e sabe o que está fazendo;)
7ochem
todos nós fazemos coisas estúpidas, tempos em tempos .....
MagenX
2
O maior risco com substituições locais é usá-los com a versão incompatível do magento, pelo que o autor mantém a extensão atualizada com a versão mais recente do magento. E se você está na versão mais antiga do magento, brincar com o PHP7 é ... Além disso, seguir cegamente as melhores práticas também é estúpido, há situações em que vale a pena "quebrá-las". Eu acho que é apenas mais um exemplo da abordagem do "culto à carga". Btw, a extensão é incrível :)
grizwako
O único problema que tenho aqui é o suporte de mods. Nós nunca sabemos o que nossos clientes vão querer usar quando se trata de mods e ter que testar / atualizar todos os mods para serem compatíveis com o php 7 é um pesadelo.
Bill Garrison
21

Não faço ideia do PHP7, mas acho que a maioria das coisas ainda é válida no PHP7, você pode encontrar mais informações no blog de Matthias Geniar

  • ext / mysql: apesar de ser uma extensão MySQL muito antiga, eu acho que ainda é muito usado, mas é hora de todos mudarem para pdo_mysql.
  • set_magic_quotes_runtimee magic_quotes_runtime: parece que eu tenho visto esses avisos de reprovação desde ... para sempre?
  • iconv.input_encoding, iconv.output_encoding: até agora, eu nunca tive um uso para estes ...
  • #comentários de estilo em arquivos ini: viva a consistência, eu sempre preferi; (ponto e vírgula) comentários em arquivos .ini!
  • preg_replace()eval modifier: viva para administradores de sistemas preocupados com a segurança!

Eu acho que a única coisa que podemos ter no Magento é um preg_replace()modificador eval, mas espero que não.

Além disso, o Magento enviou a versão 1.9.2 com um TAF atualizado, você pode encontrar no dev. Com isso, você poderá executar vários testes de front-end no PHP7 e examinar o log posteriormente

Fabian Blechschmidt
fonte
11
Respeitando o argumento de Fabian, sua melhor aposta para testar é começar com uma instalação 1.9.2 limpa, carregar os dados da amostra e executar os testes TAF. Sem dúvida, haverá algumas coisas que geram erros ou quebras, e provavelmente ainda mais quando você começa a adicionar extensões de terceiros e quaisquer personalizações que você tenha adicionado à sua instalação. O Zend estava testando o Magento no lançamento do PHP 7 e eu ficaria surpreso se houvesse ALGUNS problemas importantes, embora não que MUITOS problemas menores. Da 1.9.2 é o lugar para começar a testar ....
Bryan 'BJ' Hoffpauir Jr.
Boa explicação Fabian..thx
Amit Bera
2
Eu tenho testado o Magento 1.9CE no php7 beta, faz uma enorme diferença para o painel de administração ... As tarefas de catálogo etc. são muito rápidas. Em uma loja de produtos 3000, a página de administração da lista de catálogos passou do carregamento de 12s (php5-fpm) para 3.5s (php7-fpm). Estamos interessados ​​em usar isso na produção, por isso estou usando o nginx para rotear o tráfego de URL do administrador via php7 e mantendo o tráfego frontal no php5-fpm por enquanto. Animado para a liberação php7, embora :)
Ricky Odin Matthews
@RickyOdinMatthews Como isso está funcionando para você? Ainda executando o admin apenas no php7? Algum problema? Você poderia compartilhar a parte da configuração do NGINX que encaminha o admin para o php7?
Ottonet
11
@ Ottonet sim, ainda o usa no admin. Eu coloquei o meu extrato conf 'default' aqui por você pastebin.com/9z1U94ug
Ricky Odin Matthews
13

Nenhum comentário sobre o Magento 1, mas o Magento 2 teve alguns problemas com nomes de classes como "String". Não demorou muito para consertar, mas não funcionou imediatamente. Espero que o Magento 2 seja corrigido, mas ainda não pode ser corrigido devido a outras prioridades primeiro.

Alan Kent
fonte
11
Thans Alan pela informação. Para referência, esta é a questão do Github: github.com/magento/magento2/issues/1367 (ainda outras palavras reservadas, como "objeto" como parece) #
Fabian Schmengler
3
Estado atual: nomes de classe fixados em desenvolver ramo, problemas não mais conhecidos
Fabian Schmengler
10

Está quase pronto. Tentei executar um Magento 1.9.2.1 limpo com o PHP 7 RC1, que resultou em uma falha instantânea (erro fatal) do Magento. Depois de corrigir esse problema, tudo parecia estar funcionando, exceto o back-end, no qual eu não conseguia fazer login. Mais tarde, acabou por ser um problema relacionado à sessão que pode ser corrigido.

Resumidamente:

  1. O erro fatal pode ser corrigido substituindo Mage_Core_Model_Layoute alterando a linha 555 de:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    para
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. O problema sessão temporariamente pode ser corrigido, substituindo Mage_Core_Model_Session_Abstract_Variene reescrever o getData, setData, unsetData, addFullNamesmétodos, por isso em todos os lugares em que $this->_datafoi usado, ele será substituído por $_SESSION.

Se alguém estiver interessado na solução, ela pode ser encontrada aqui .

Zsolti
fonte
11
Claro que alguém está interessado na solução ;-) Você pode resumir o conteúdo do artigo vinculado? Não há nada de errado em vincular seu blog a informações adicionais, mas a resposta deve ser independente.
Fabian Schmengler
Bem, a questão era se o Magento está pronto para o PHP 7, não sobre como fazê-los trabalhar juntos. De qualquer forma, atualizei minha resposta com uma breve solução.
Zsolti
11
Ocorre um erro semelhante Varien_File_Uploader, consulte magento.stackexchange.com/questions/93066/…
Fabian Schmengler
O mesmo para 1.9.2.4
lrkwz
8

O Magento2 está pronto para o PHP 7. A adaptação do código ao PHP7 foi feita e todas as alterações estão disponíveis no ramo de desenvolvimento. Veja o problema no GitHub

Além disso, o suporte ao php 7 no Magento1 exige alterações incompatíveis com versões anteriores e acho que não será suportado oficialmente.

KAndy
fonte
é incrível que o M2 e o PHP 7 sejam lançados no mesmo mês - novembro de 2015!
FireBear
7

Há um problema com a forma como o Magento está calculando o total geral do pedido e aplicando os descontos. Isso também interrompe o check-out expresso do Paypal, pois os itens de linha não somam o total geral com o desconto.

O problema parece ser que ele Mage_Sales_Model_Config_Ordered::_compareTotals()não está funcionando da mesma maneira no PHP7 que o PHP5 e uasort()agora depende de um relacionamento transitivo para a encomenda, mas isso não precisa ser para os totais da ordem.

Tente 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
fonte
Excelente, acertou meu estranho + 20% de imposto sobre o total geral.
evensis 17/03/16
6

Esta é minha pesquisa que quero compartilhar com você sobre as incompatibilidades do magento php7. Atualmente, encontrei alguns lugares em que o código deve falhar devido à sintaxe variável uniforme.

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

Método: overrideAttribute

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

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

Método: filterAttributeCollection

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

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

Método: _validateFile

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

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

Método: assign

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

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

Método: atualização

$data->$attribute['code']

Arquivo: lib / Varien / Arquivo / Uploader.php

Método: _validateFile

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

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

Método: getOutput

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

Além das outras respostas relacionadas ao Magento 1:

Uma incompatibilidade do PHP 7 Zend_XmlRpc_Serverfoi corrigida no Zend Framework 1.12.12

Todas as versões anteriores da CE 1.9.2.2 / EE 1.14.2.2 usam uma versão mais antiga do Zend Framework, portanto, podem ter problemas se você usar a API XML-RPC do Magento.

Fabian Schmengler
fonte
1

Estou usando o Magento 2 CE versão 2.1.4 e funciona bem.

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
fonte
1

Resposta curta é não, não é. Magento CE 1.9.2.4 suporta apenas PHP 5.4 e 5.5 oficialmente. E enquanto o PHP 5.6 o executa perfeitamente, satura os arquivos de log com inúmeras mensagens de aviso.

A resposta longa é que é relativamente fácil modificá-lo para executar o suporte ao PHP7. No entanto, muitas extensões ainda não são compatíveis com o PHP7, então você está sozinho.

Sheshgiri Anvekar
fonte
0

O PHP 7.0 é o fim da vida útil na primeira semana de dezembro de 2018.

Até agora, a versão atual do Magento 2.2.3 (versão de 20 de fevereiro de 2018) não suporta PHP 7.1 ou PHP 7.2.

Você pode confirmar as versões suportadas, verificando app/bootstrap.phpsua pasta de instalação do Magento e procurando um código semelhante ao seguinte:

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

Também parece haver problemas nos .htaccessquais causam 500 erros no apache 2.4.

Além disso, o arquivo do compositor incluído contém apenas dependências para o php5.5

Kraang Prime
fonte