O Magento está pronto para PHP 7?
-
13-12-2019 - |
Pergunta
O PHP 7 está atingindo o status beta e muitos testes estão acontecendo no momento.Dado que o Magento passou de "roda apenas em PHP 5.3" para "totalmente compatível com PHP 5.6" no ano passado, gostaria de saber o quanto eles estão considerando a compatibilidade do PHP 7 para Magento 1.x e Magento 2.
eu encontrei esta postagem 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 unitários, não confio que esse tenha sido o único problema.
Então a questão é:a compatibilidade do PHP 7 para Magento 1 será garantida?E como o Magento 2 provavelmente já foi testado no PHP 7 (graças aos testes automatizados!), Existe algum problema conhecido?
Solução
magento anunciou oficialmente em 20 de janeiro de 2016, que CE e EE 2.0.1 suportam oficialmente PHP 7.0.2.
.Magento Enterprise Edition e Community Edition 2.0.1 são agora Disponível e apresenta uma importante segurança e atualizações funcionais, incluindo suporte oficial para PHP7.0.2.
link: https://magento.com/blog/techicical/new-magento-20-recursos-e-support-php7
Outras dicas
Se você estiver usando a versão mais recente, m CE 1.9.2.2, há uma extensão que trará para a compatibilidade de PHP 7 completa: https://github.com/inchoo/inchoo_php7 .(Disclaimer: Eu sou o autor, embora haja muita ajuda da comunidade.)
Também é instalado através do compositor de http://packages.firegento.com/ .
Todas as incompatibilidades mencionadas aqui são fixas.Achamos que ainda pode haver alguns casos de borda, mas nada a parada.Testes, emitir solicitações de relatórios e pull são bem-vindos.
Não faço ideia sobre o PHP7, mas acho que a maior parte do material ainda é válido no PHP7, você pode encontrar mais informações no blog do Matthias Geniar
- ext/mysql: apesar de ser uma extensão muito antiga do MySQL, eu acho que ainda é muito usada, mas é hora de todos migrarem para o pdo_mysql.
set_magic_quotes_runtime
emagic_quotes_runtime
: parece que vi esses avisos de depreciação desde ...para sempre?iconv.input_encoding
,iconv.output_encoding
: até agora nunca usei isso...#
comentários de estilo em arquivos ini: viva pela consistência, sempre preferi;(ponto e vírgula) comentários em arquivos .ini!preg_replace()
modificador de avaliação: viva para administradores de sistemas preocupados com a segurança!
Acho que a única coisa que podemos ter no Magento é preg_replace()
modificador de avaliação mas espero que não.
Além disso, o Magento lançou o 1.9.2 com um TAF atualizado, que você pode encontrar em dev.Com isso você poderá executar vários testes de frontend no PHP7 e examinar o log depois
Nenhum comentário no Magento 1, mas Magento 2 teve alguns problemas com nomes de classes como "string".Não demorou muito para consertar, mas não funcionou fora da caixa.Espero que o Magento 2 seja corrigido, mas pode não ser corrigido ainda devido a outras prioridades primeiro.
Está quase pronto.Tentei executar um Magento 1.9.2.1 limpo com PHP 7 RC1, o que resultou em uma falha instantânea (erro fatal) do Magento.Depois de corrigir esse problema, tudo parecia estar funcionando, exceto o backend, no qual não consegui fazer login.Mais tarde, descobriu-se que era um problema relacionado à sessão que pode ser corrigido.
Brevemente:
O erro fatal pode ser corrigido substituindo
Mage_Core_Model_Layout
então mudando a linha 555 de:
$out .= $this->getBlock($callback[0])->$callback[1]();
em
$out .= $this->getBlock($callback[0])->{$callback[1]}();
O problema da sessão pode ser corrigido temporariamente substituindo
Mage_Core_Model_Session_Abstract_Varien
e reescrevendo ogetData
,setData
,unsetData
,addFullNames
métodos, então em todos os lugares onde$this->_data
foi usado, ele será substituído por$_SESSION
.
Se alguém estiver interessado na solução, ela pode ser encontrada aqui.
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 Desenvolvimento.Veja o problema em github
Além disso, o apoio do PHP 7 no Magento1 requer alterações incompatíveis para trás e acho que não será suportado oficialmente.
Há um problema em como o Magento calcula o total geral do pedido e aplica os descontos.Isso também interrompe o checkout expresso do Paypal, pois os itens de linha não somam o total geral com o desconto.
O problema parece ser que o Mage_Sales_Model_Config_Ordered::_compareTotals()
não está funcionando da mesma forma no PHP7 e no PHP5, e uasort()
agora depende do relacionamento transitivo para o pedido, mas isso não precisa ser para os totais dos pedidos.
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;
}
Esta é minha pesquisa que quero compartilhar com vocês sobre as incompatibilidades do magento php7.Atualmente encontrei alguns lugares onde o código deve falhar devido à sintaxe uniforme das variáveis.
Arquivo:app/code/core/Mage/ImportExport/Model/Export/Entity/Product/Type/Abstract.php
Método:substituirAtributo
$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:_validarArquivo
$params['object']->$params['method']($filePath);
Arquivo:app/code/core/Mage/Catalog/Model/Product/Link/Api/V2.php
Método:atribuir
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:atualizar
$data->$attribute['code']
Arquivo:lib/Varien/File/Uploader.php
Método:_validarArquivo
$params['object']->$params['method']($this->_file['tmp_name']);
Arquivo:app/code/core/Mage/Core/Model/Layout.php
Método:obter saída
$out .= $this->getBlock($callback[0])->$callback[1]();
Além das outras respostas relacionadas com Magento 1:
A incompatibilidade do PHP 7 no Zend_XmlRpc_Server
foi corrigido no Zend Framework 1.12.12
Todas as versões anteriores CE 1.9.2.2.2.2.2.2 Use uma versão mais antiga do Zend Framework, talvez tenha problemas se você usar a API XML-RPC do Magento.
Verifique os arquivos do ICCOO que são alterados para M1 compatível com o PHP 7, essas são menores alterações em poucos arquivos, mas o trabalho inteligente de Incheco. https://github.com/inchoo/inchoo_php7/tree/ mestre / app / código / local / iao / php7
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);
}
Resposta curta é não, não.O Magento CE 1.9.2.4 só suporta o PHP 5.4 e 5.5 oficialmente.E enquanto o PHP 5.6 corre bem, ele satura arquivos de log com multidões de aviso.
Longa resposta é que é relativamente fácil modificá-lo para executar o suporte de suporte.No entanto, muitas extensões ainda não são compatíveis com PHP7, então você é em grande parte por conta própria.
O PHP 7.0 está em fim de vida na primeira semana de dezembro de 2018.
A partir desta postagem, a versão atual do Magento 2.2.3 (versão de 20 de fevereiro de 2018) não oferece suporte a PHP 7.1 ou PHP 7.2.
Você pode confirmar as versões suportadas verificando app/bootstrap.php
na pasta de instalação do Magento e procure 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 .htaccess
que causam 500 erros com o Apache 2.4.
Além disso, o arquivo compositor incluído contém apenas dependências para php5.5