【问题标题】:hhvm nginx toString server error with Magento MagmiMagento Magmi的hhvm nginx toString服务器错误
【发布时间】:2015-09-05 08:17:28
【问题描述】:

我正在尝试在 Magento 应用程序上运行 magmi 产品导入插件,该应用程序在具有 NGINX 和 HHVM 的 aws ec2 实例上运行。当我尝试在 Magento 上运行 magmi 产品导入应用程序时,我的 hhvm 错误日志 中出现以下服务器错误。

/var/log/hhvm/error.log

\nCatchable fatal error: Object of class Magmi_ProductImportEngine could not be converted to string in /var/www/qa-hoi/magmi-importer/inc/magmi_mixin.php on line 9

这是 magmi_mixin.php 文件

<?php
class Magmi_Mixin
{
    protected $_callers;

    public function bind($caller)
    {
        $this->_callers[]=$caller;
        $this->_callers=array_unique($this->_callers);  // LINE 9   
    }

    public function unbind($caller)
    {

        $ks=array_keys($this->_callers,$caller);
        if(count($ks)>0)
        {
            foreach($ks as $k)
            {   
                unset($this->_callers[$k]);
            }
        }

    }

    public function __call($data,$arg)
    {
        if(substr($data,0,8)=="_caller_")
        {
            $data=substr($data,8);
        }
        for($i=0;$i<count($this->_callers);$i++)
        {
            if(method_exists($this->_callers[$i],$data))
            {
              return call_user_func_array(array($this->_callers[$i],$data), $arg);
            }
            else
            {
                die("Invalid Method Call: $data - Not found in Caller");
            }
        }
    }
}

知道我应该如何解决这个问题吗?我应该更新我的 php.ini 文件吗?

可能导致致命错误的原因。它没有发生在我的本地机器上,它有 Apache。


更新

我在本地机器上安装了 HHVM 并运行了 xdebug。 magmi 文件中的$caller 对象似乎包含几个无法评估的数组。请看下面的截图:

【问题讨论】:

    标签: php magento nginx hhvm magmi


    【解决方案1】:

    我有同样的问题。我的解决方案是简单地注释掉有问题的行。

        public function bind($caller)
    {
        $this->_callers[]=$caller;
        // $this->_callers=array_unique($this->_callers);  // LINE 9   
    }
    

    您可能还会发现 Magmi 在 /magmi/web/magmi_run.php 上出现“500 hphp_invoke”错误。为了解决这个问题,我在第一个 if 语句中添加了一个异常处理程序。我的 magmi_run.php 文件现在读取...

    <?php
    $params = $_REQUEST;
    ini_set("display_errors", 1);
    require_once ("../inc/magmi_defs.php");
    require_once ("../inc/magmi_statemanager.php");
    try {
        $engdef = explode(":", $params["engine"]);
        $engine_name = $engdef[0];
        $engine_class = $engdef[1];
        require_once ("../engines/$engine_name.php");
    } catch (Exception $e) {
        die("ERROR");
    }
    if (Magmi_StateManager::getState() !== "running") {
        try {
            Magmi_StateManager::setState("idle");
            $pf = Magmi_StateManager::getProgressFile(true);
            if (file_exists($pf)) {
                @unlink($pf);
            }
            set_time_limit(0);
            $mmi_imp = new $engine_class();
            $logfile = isset($params["logfile"]) ? $params["logfile"] : null;
            if (isset($logfile) && $logfile != "") {
                $fname = Magmi_StateManager::getStateDir() . DIRSEP . $logfile;
                if (file_exists($fname)) {
                     @unlink($fname);
                }
                $mmi_imp->setLogger(new FileLogger($fname));
            } else {
                $mmi_imp->setLogger(new EchoLogger());
            }
            $mmi_imp->run($params);
        } catch (Exception $e) {
            die("ERROR");
        }
    } else {
        die("RUNNING");
    }
    ?>
    

    【讨论】:

    • 感谢工作。我只需要注释掉magmi_mixin.php这行,我不知道我怎么没有尝试过!我不需要更改magmi_run.php,我想知道为什么您必须更改而我没有更改?无论如何感谢您的回答:)
    • 它也对我有用 :),我想弄清楚如果我发现我会在这里发帖,为什么会发生这种情况
    • 看起来 HHVM 处理数组的方式不同。我们在购物车页面上发现了另一个与税收计算相关的问题。这篇文章总结了这一切here
    【解决方案2】:

    HHVM 比 PHP 限制得多,当涉及到已弃用的约束和函数、警告和通知时,因此在 PHP 中运行良好的(不是很好编写的)代码在 HHVM 中无法正常运行的情况并不少见.

    关于您的特定问题:

    根据 HHVM 的文档,这就是第 9 行中发生的情况,问题出在 array_unique 的参数中(请参阅 http://docs.hhvm.com/manual/en/function.array-unique.php):

    array_unique($this->_callers)
    

    HHVM 手册指出:

    function array_unique ( array $array [, int $sort_flags = SORT_STRING ] ): array
    

    这意味着你传递给array_unique的数组作为第一个参数,因为第二个参数默认为SORT_STRING,所以期望只包含字符串元素或其他类型的元素,只要它们都可以直接转换为字符串。

    对象只有在定义(或继承)“魔术”方法__toString()时才能转换为字符串。

    因此,一种解决方案是修改 Magmi_ProductImportEngine 类的代码,添加如下内容:

    class Magmi_ProductImportEngine /* extends whatever */ {
         // ... other stuff
    
         public function __toString() {
             return 'array representation of the object as string for sorting purposes';
         }
    
         // ... other stuff
    }
    

    但是,我也不希望相同的代码在 Apache mod-php 中没有错误的情况下工作,(它应该失败并出现“PHP 可捕获的致命错误:Magmi_ProductImportEngine 类的对象无法转换为字符串”),也许在您的 Apache 版本中,数组“$this->_callers”不包含元素中的 Magmi_ProductImportEngine 实例?

    【讨论】:

    • 虽然它不会影响您回答的实质,但在运行 PHP 代码时,HHVM 通常不应该比 PHP5 更严格。如果有这样的情况,您应该在 GitHub 上针对 HHVM 提出问题。
    • @Dmitri 谢谢,我不确定将什么作为__toString() 的返回值。我复制了你的代码并在 HHVM 日志\nCatchable fatal error: Object of class Magmi_CSVDataSource could not be converted to string in /var/www/qa-hoi/magmi-importer/inc/magmi_mixin.php on line 9 中发现了一个新错误
    • @Josh,__toString()返回的值用于排序。如果_callers 数组中对象的顺序不重要,则可以返回任何值,包括空字符串。 Magmi_CVSDataSource 的新错误是由于相同的原因:缺少 __toString() 方法:也许这些对象不应该是 _callers 数组的一部分?
    • @Josh,PHP 仍然支持一些已弃用的语言功能,而 HHVM 不支持(我并不是说 HHVM 这样做是错误的)以及具有不同默认值的安全相关设置,有时打破应用程序。我知道这些是功能,而不是错误,但是——尽管如此——它可能会在现有的 PHP 代码中产生问题。此外,在 HHVM 中检测这些问题非常复杂(因为它还没有很好的文档记录)。
    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多