非常に大きな を使用して Magento で次のステートメントを実行すると、$sku
エラーがスローされることなく実行が終了します。Magento、Apache、または PHP のエラー ログにエラーはありません。
Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);
質問: エラーをキャッチするにはどうすればよいですか?
カスタム エラー ハンドラーを設定しようとしましたが、テスト目的で、各エラー ハンドラー関数が呼び出されるエラー状況をトリガーすることもできました。ただし、前述の Magento コードを大きな$sku
で実行すると、エラー処理関数は実行されません。
error_reporting( -1 );
set_error_handler( array( 'Error', 'captureNormal' ) );
set_exception_handler( array( 'Error', 'captureException' ) );
register_shutdown_function( array( 'Error', 'captureShutdown' ) );
完全を期すために、これは$sku
I'm に渡しloadByAttribute()
ます。(sku は無効ですが、それは問題ではありません)
1- 9685 0102046 | 1- 9685 1212100 | 1- 9685 1212092 | 1- 9685 1212096 | 1- 9685 1102100 | 1- 9685 1102108 | 1- 9685 1102112 | 1- 9685 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 0212045 | 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 で動作させるつもりはありません。
更新: エラーの原因
load()
によってトリガーされる呼び出しを追跡したforeach
ところ、Zend / PHP のバグに要約されます。
\www\lib\Zend\Db\Statement.php への呼び出しと_stripQuoted($sql)
次のステートメントを追跡しました:
$sql = preg_replace("/$q($qe|\\\\{2}|[^$q])*$q/", '', $sql);
(Magento 1.7.0.2 の 204 行目)。
ステートメントpreg_replace
によって生成された SQL を使用して を実行すると、プログラムはそのまま終了します。load()
Apache のログにも php のログにもトレースはありません。ログは他のものでいっぱいになるため、機能します。
問題に関するこのバグレポートを見つけました。そこでは、それがセグメンテーション違反であることを示しています。そこから立ち直る方法はないのではないでしょうか(?)。
質問は明示的にエラー状態をキャッチする方法に関するものであり、ここでの多くのアドバイスはデータのサニタイズに関するものであったため、報奨金の明確な「勝者」がいるとは思いません. しかし、Franklin P Strube は、少なくともスタックのより深い部分でチェックを行うことをほのめかしたので、彼はそれを理解しました。
みんな助けてくれてありがとう。segfaults の処理方法に関するアドバイスがあれば、共有してください =)。