Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP/Magento中捕获此低级MySQL(?)错误_Php_Magento_Error Handling - Fatal编程技术网

如何在PHP/Magento中捕获此低级MySQL(?)错误

如何在PHP/Magento中捕获此低级MySQL(?)错误,php,magento,error-handling,Php,Magento,Error Handling,当我在Magento中使用非常大的$sku执行以下语句时,执行将终止,不会抛出任何错误。Magento、Apache或PHP的错误日志中都没有错误 Mage::getModel('catalog/product')->loadByAttribute('sku',$sku) 问题:如何捕捉错误? 我试图设置自定义错误处理程序,出于测试目的,我还设法在调用每个错误处理程序函数时触发错误情况。但是,当使用大的$sku运行前面提到的Magento代码时,不会执行任何错误处理函数 error_report

当我在Magento中使用非常大的
$sku
执行以下语句时,执行将终止,不会抛出任何错误。Magento、Apache或PHP的错误日志中都没有错误

Mage::getModel('catalog/product')->loadByAttribute('sku',$sku)

问题:如何捕捉错误?

我试图设置自定义错误处理程序,出于测试目的,我还设法在调用每个错误处理程序函数时触发错误情况。但是,当使用大的
$sku
运行前面提到的Magento代码时,不会执行任何错误处理函数

error_reporting( -1 );
set_error_handler( array( 'Error', 'captureNormal' ) );
set_exception_handler( array( 'Error', 'captureException' ) );
register_shutdown_function( array( 'Error', 'captureShutdown' ) );
为了完整起见,这是我要传递给
loadByAttribute()
$sku
。(sku无效,但这不是问题所在)

1-96850102046 | 1-96851212100 | 1-96851212092 | 1-96851212096 | 1- 9685 1102100|1- 9685 1102108|1- 9685 1102112|1- 9685 1102092|1- 9685 0102048|1- 9685 0102054|1- 9685 0102056|1- 9685 0102058|1- 9685 1212104|1- 9685 1212108|1- 9685 0212058|1- 9685 0104050|1- 9685 0212050|1- 9685 0212056|1- 9685 0212044|1- 9685 0212048|1- 9685 0212052 | 1-9685 0212054 | 1-9685 1102104 | 1-9685 1102124

非常感谢您对此事的任何见解

更新: 经过进一步调查,这正是代码中执行终止的位置。当foreach被执行时,我猜Magento进入MySQL世界,开始从数据库加载数据

\Mage\Catalog\Model\Abstract.php

 public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
    {
        $collection = $this->getResourceCollection()
            ->addAttributeToSelect($additionalAttributes)
            ->addAttributeToFilter($attribute, $value)
            ->setPage(1,1);

        foreach ($collection as $object) { // <--------------- HERE
            return $object;
        }
        return false;
    }
公共函数loadByAttribute($attribute,$value,$additionalAttributes='*'))
{
$collection=$this->getResourceCollection()
->addAttributeToSelect($additionalAttributes)
->addAttributeToFilter($attribute,$value)
->setPage(1,1);

foreach($collection as$object){/您不需要注册自己的错误处理程序,Magento已经为您注册了。 您只需执行几个步骤:

  • 通过取消index.php中下一行的注释来启用错误报告:

    #ini_set('display_errors', 1);
    
  • 确保日志记录已打开:转到管理面板 系统->配置->开发人员->日志设置,将启用设置为是。 现在,您可以从Magento根目录检查
    var/log
    中的Magento日志


  • 任何php错误都应该属于php致命错误或日志。

    我相信脚本可能在堆栈中终止的深度比您指示的更深。当集合开始“foreach”循环时,它必须首先调用“load”函数,这是它构建SQL的具体位置

    您可以尝试记录
    Mage::log((字符串)$collection->getSelect());
    以查看SQL查询是否有问题


    或者,您是否能够在过滤之前对sku进行清理?也许可以使用观察者?

    不要忘记在php.ini、.htaccess或使用ini\u设置中设置日志路径

    .htaccess示例:

    php_flag log_errors on
    php_value error_log /var/www/PHP_errors.log
    

    如果Magento正在使用PDO,通常应将PDO设置为异常模式

    这就是我在PHP 5.2.x中使用的内容:

    error_reporting(-1);
    ini_set("display_errors", "On");
    
    function errhandler($nSeverity, $strMessage, $strFilePath, $nLineNumber){
        error_log(PHP_EOL.date("Y-m-d H:m:s", time())." ".$strFilePath."#".$nLineNumber.": ".$strMessage.PHP_EOL);
        throw new ErrorException($strMessage, /*nExceptionCode*/ 0, $nSeverity, $strFilePath, $nLineNumber);
    }
    set_error_handler("errhandler", -1);
    

    当PHP内存不足时会出现此问题

    从php.ini增加允许的内存大小 或者动态增加内存限制


    将此
    ini\u集('memory\u limit','512M');

    放入index.php中,将以下行移到index.php文件的顶部:

    ini_set('display_errors', 1);
    
    我感觉您的问题不是因为权限问题而标记此触发器。我运行这两个命令以确保对文件/目录正确设置权限

    find . -type d -exec chmod 755 {} \;
    find . -type f -exec chmod 644 {} \;
    
    前两个问题:

    • 您如何知道实际存在错误?例如,php代码的某些部分中的
      退出将不会引发错误,但脚本将被终止
    • 你说
      “我猜Magento进入了MySQL世界并开始从数据库加载数据”
      。你检查过MySQL服务器上发生了什么吗?SQL查询真的被发送了吗?如果被发送,它会被处理、出错还是停止

    我建议使用调试器从
    foreach($collection
    行开始逐步执行PHP代码。我不知道您使用的是什么编辑器/IDE,您可以设置并允许设置断点并逐步执行代码。

    我不认为是
    foreach
    杀死了脚本

    请尝试在执行以下操作之前立即分解呼叫:

    public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
    {
        $res1 = $this->getResourceCollection();
        $res2 = $res1->addAttributeToSelect($additionalAttributes);
        $res3 = $res2->addAttributeToFilter($attribute, $value);
    
        $collection = $res3->setPage(1,1);
    
        foreach ($collection as $object)
            return $object;
        }
        return false;
    }
    

    否则,如果SKU长度过大,或者SKU未通过某些消毒检查,您可能只想抛出异常。

    我在Magento 1.7中遇到了与客户相同的错误

    我有一个SQLINSERT语句,它将边栏购物车html保存在一个字段中,在该语句中,我对该html使用了addslashes

    当该html中有1到5个产品时,save语句将成功执行

    当有5个以上的产品时,这意味着html较长,但每个产品的部分相同,我也会在这个错误中运行

    程序只在$sql=preg\u replace(“/$q($qe | \{2}[^$q])*$q/”,“”,$sql)处停止,并且没有可见的错误


    这似乎是一个内存问题,6个产品的大小超过了限制(现在是7000个字符),因此提供商必须更改php设置,我猜..

    终止,意味着空白页、浏览器超时或什么?我们可以说它意味着空白页。我通过终端的脚本而不是浏览器执行Magento。当Mage::getModel('catalog/product')->loadByAttribute('sku',$sku)时,执行就会停止如果是运行。那么它只是超时或内存不足,请尝试直接按产品id加载,看看您的SKU fu*此upIt是否超时。我知道触发错误的是SKU。问题的关键是为什么执行会终止,为什么无法捕获它。然后尝试{}捕获?从以前开始,我就打开了显示错误,并且在Magento中打开了日志记录。仍然没有骰子。我也尝试过使用和不使用我自己的错误ha