当我在 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- 9685 0102046|1- 9685 1212100|1- 9685 1212092|1- 9685 1212096|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;
}
请注意,我只对找出如何正确捕获这些类型的错误感兴趣,而不是“修复”逻辑。这样我就可以向用户显示正确的错误消息。上面带有格式错误的 sku 的示例是人为设计的,我不想让我的 Magento 应用程序与那些错误的 sku 一起工作。
更新:错误原因
我跟踪了由 foreach
触发的 load()
调用,它归结为 Zend/PHP 的错误。
我跟踪了对\www\lib\Zend\Db\Statement.php _stripQuoted($sql)
的调用,以及以下语句:
$sql = preg_replace("/$q($qe|\\\\{2}|[^$q])*$q/", '', $sql);
(在线204 在 Magento 1.7.0.2 中)。
当 preg_replace
与 load()
语句生成的 SQL 一起运行时,程序就终止了。在 apache 或 php 的日志中都没有踪迹。日志有效,因为它们充满了其他东西。
I found this bug report on the issue .他们在那里指出这是一个段错误。我想有 无法从中恢复(?)。
由于问题明确是关于如何捕获错误情况,并且这里的很多建议更多地是关于清理数据的,所以我认为赏金没有明确的“赢家”。但 Franklin P Strube 至少暗示要在堆栈的更深处进行检查,所以他明白了。
谢谢大家的帮助。如果您对如何处理段错误有任何建议,请分享 =)。
最佳答案
我相信脚本可能会在比您指示的更深的堆栈中终止。当集合开始“foreach”循环时,它必须首先调用“加载”函数,该函数专门用于构建 SQL。
您可以尝试记录 Mage::log((string)$collection->getSelect());
以查看 SQL 查询是否有问题。
或者,您能否在过滤前对 sku 进行清理?也许使用观察者?
关于php - 如何在 PHP/Magento 中捕获这个低级别的 MySQL(?)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12893610/