Magento准备好使用PHP 7了吗?


71

PHP 7即将达到测试版状态,目前正在进行大量测试。考虑到Magento在去年从“仅在PHP 5.3上运行”发展到“与PHP 5.6完全兼容”,因此我想知道他们考虑了多少与Magento 1.x和Magento 2兼容的PHP 7。

我在Anna Filina的这篇文章中找到了她在Magento 1.9.1中发现的一个问题(在1.9.2中仍未更改),但是考虑到Magento 1没有单元测试,我不相信这是唯一的问题。

因此,问题是:是否可以确保PHP 7与Magento 1的兼容性?而且由于Magento 2可能已经在PHP 7上进行了测试(谢谢自动化测试!),所以是否存在任何已知问题?


我刚刚在php7上尝试了magento 2.1.2,但没有成功。
guru1

@ guru1您能详细说明为什么吗?以我的经验,它运作良好。
Fabian Schmengler,

@guru ...我正在magento 2.1.2上的php 7上开发我的项目,并且工作正常。你面对什么问题?
2016年

Answers:



26

如果您使用的是最新版本,男CE 1.9.2.2,有一个扩展,将它带到完整的PHP 7兼容性:https://github.com/Inchoo/Inchoo_PHP7。(免责声明:我是作者,尽管社区提供了很多帮助。)

也可以通过Composer从http://packages.firegento.com/安装。

此处提到的所有不兼容问题都是固定的。我们认为可能仍然存在一些边缘情况,但没有任何停滞的迹象。欢迎测试,问题报告和请求请求。


放置一些局部替换是一个非常糟糕的主意...
MagenX

2
@MagenX,除非您是Inchoo并且知道您在做什么;)
7ochem

我们都会时不时做愚蠢的事情..
MagenX '16

2
本地替代的最大风险是将它们与不兼容的magento版本一起使用,从作者的角度来看,作者一直在扩展最新的magento版本。而且,如果您使用的是旧版本的magento,则使用PHP7是...。此外,盲目遵循最佳实践也是很愚蠢的,在某些情况下值得“打破常规”。我认为这只是“货运崇拜”方法的又一个例子。顺便说一句,扩展很棒:)
grizwako '16

我在这里唯一的问题是对mod的支持。我们永远不知道我们的客户在使用mod时需要使用什么,并且必须测试/升级每个与php 7兼容的mod是一场噩梦。
比尔·加里森

21

完全不了解PHP7,但我想大多数东西在PHP7中仍然有效,您可以在Matthias Geniar的博客中找到更多信息。

  • ext / mysql:尽管它是一个非常老的MySQL扩展,但我认为它仍然被广泛使用,但是现在是每个人都使用pdo_mysql的时候了。
  • set_magic_quotes_runtimemagic_quotes_runtime似乎……自从……我一直看到这些弃用通知?
  • iconv.input_encodingiconv.output_encoding到目前为止,我从来没有用过这些...
  • #ini文件中的样式注释:求求一致,我一直很喜欢;(分号)在.ini文件中的注释!
  • preg_replace()eval修改器:万岁,安全意识强的sysadmins!

我认为我们在Magento中唯一可能拥有的是preg_replace()eval修饰符,但希望不是。

除此之外,Magento还发布了带有更新的TAF的1.9.2,可以在dev中找到。有了这个,您应该能够在PHP7上运行一堆前端测试,然后再检查日志


1
呼应Fabian的观点,最好的测试选择是从全新的1.9.2安装开始,加载示例数据,然后运行TAF测试。毫无疑问,会有一些东西会引发错误或中断,甚至可能在您开始添加3rd Party Extensions和可能已添加到安装中的任何自定义项时发生。Zend曾经在PHP 7发行版上测试过Magento,如果有任何重大问题,我会感到惊讶,尽管不是有很多次要问题。股票1.9.2开始测试的地方....
布莱恩“BJ” Hoffpauir小

很好的解释Fabian..thx
Amit Bera

2
我已经在php7 beta上测试了Magento 1.9CE,它对管理面板有很大的不同...目录任务等是如此之快。在3000家产品商店中,目录列表管理页面从12s加载(php5-fpm)变为3.5s(php7-fpm)。我们热衷于在生产中使用它,因此我正在使用nginx通过php7路由管理url流量,并且暂时将前端流量保持在php5-fpm上。令人兴奋的是php7发布:)
Ricky Odin Matthews

@RickyOdinMatthews这如何为您解决?仍然仅在php7上运行admin?有什么问题吗?您能否共享将admin路由到php7的NGINX配置的一部分?
Ottonet

1
@Ottonet是的,仍在管理员身上使用它。我在这里为您提供了“默认”的conf提取信息pastebin.com/9z1U94ug
Ricky Odin Matthews

13

没有对Magento 1进行评论,但是Magento 2确实对类名(如“ String”)存在一些问题。修复时间不长,但是开箱即用。我希望Magento 2将得到修复,但是由于其他优先事项,它可能尚未修复。


1
Thans Alan提供信息。作为参考,这是Github问题:github.com/magento/magento2/issues/1367看起来还像“ object”这样的其他保留字)
Fabian Schmengler,2015年

3
当前状态:在开发分支中固定的类名称,没有其他已知问题
Fabian Schmengler,2015年

10

快准备好了。我尝试使用PHP 7 RC1运行干净的Magento 1.9.2.1,这导致Magento立即崩溃(严重错误)。解决此问题后,除了后端(我无法登录)之外,其他所有功能似乎都可以正常工作。后来发现是与会话相关的问题,可以修补。

简要地:

  1. 致命错误可以是固定通过重写Mage_Core_Model_Layout然后从变化的线路555:
    $out .= $this->getBlock($callback[0])->$callback[1]();

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

  2. 会话问题暂时可以通过覆盖固定Mage_Core_Model_Session_Abstract_Varien和重写getDatasetDataunsetDataaddFullNames方法,使无处不在哪里$this->_data使用,它会被替换$_SESSION

如果有人对解决方案感兴趣,可以在此处找到。


1
当然,有人对解决方案感兴趣;-)您可以总结链接文章的内容吗?将博客与其他信息链接没有任何问题,但是答案应该能够独立存在。
Fabian Schmengler,2015年

好吧,问题是Magento是否准备好使用PHP 7,而不是如何使它们协同工作。无论如何,我已经通过简短的解决方案更新了答案。
Zsolti

1
在发生类似的错误Varien_File_Uploader,请参阅magento.stackexchange.com/questions/93066/...
法比安Schmengler

同样适用于1.9.2.4
lrkwz

8

Magento2已准备好用于PHP7。已经完成了对PHP7的代码适应,并且所有更改都可以在development分支中找到。在GitHub上查看问题

另外,Magento1中对php 7的支持需要向后不兼容的更改,我认为将不正式支持。


M2和PHP 7将于同月-2015年11月发布,真是令人惊讶!
FireBear

7

Magento如何计算订单总计并应用折扣存在问题。这也将停止Paypal Express结帐,因为这些订单项不会加总到折扣中。

问题似乎在于,Mage_Sales_Model_Config_Ordered::_compareTotals()在PHP7中,不能与PHP5一起工作,并且uasort()现在依靠传递关系进行排序,但这不必用于订单总数。

尝试使用:-

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

太好了,我把总金额加了20%的税,这真是我的怪异。
Evensis

6

这是我的研究,我想与您分享有关magento php7不兼容的问题。目前,我发现由于统一变量语法而导致代码失败的地方。

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

方法:overrideAttribute

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

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

方法:filterAttributeCollection

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

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

方法:_validateFile

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

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

方法:分配

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

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

方法:更新

$data->$attribute['code']

档案:lib / Varien / File / Uploader.php

方法:_validateFile

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

文件:app / code / core / Mage / Core / Model / Layout.php

方法:getOutput

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

5

除了与Magento 1相关的其他答案:

Zend_XmlRpc_ServerZend Framework 1.12.12中修复了PHP 7中的不兼容问题。

CE 1.9.2.2 / EE 1.14.2.2之前的所有版本都使用Zend Framework的旧版本,因此如果您使用Magento的XML-RPC API,则可能会有问题。



1

我正在使用Magento 2 CE版本2.1.4,并且工作正常。

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

简短的答案是不,不是。Magento CE 1.9.2.4仅正式支持PHP 5.4和5.5。尽管PHP 5.6可以很好地运行,但它会使日志文件充满大量警告消息。

长答案是,修改它以运行支持PHP7相对容易。但是,许多扩展仍然不兼容PHP7,因此您基本上只能靠自己了。


0

自2018年12月第一周起,PHP 7.0的生命周期终止。

截至本文发布时,当前版本的Magento 2.2.3(2018年2月20日发行)不支持PHP 7.1或PHP 7.2。

您可以通过检查app/bootstrap.phpMagento安装文件夹来确认支持的版本,并查找类似于以下内容的代码:

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

似乎还有一些问题.htaccess导致apache 2.4出现500个错误。

此外,包含的composer文件仅包含php5.5的依赖项

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.