現在、バックトレースとともにエラーをログに記録するロガーがあります。ロガーは を介してバックトレースを JSON にシリアル化しますjson_encode()
。
いくつかの仮想コードを見てみましょう...
<?php
error_reporting(-1); // show all errors
function test($b){
echo json_encode(debug_backtrace()); // take a backtrace snapshot
}
$c = imagecreate(50,50); // create a resource...
test($c); // ...and pass to function
?>
上記のコードを実行すると、次のように表示されます。
警告: json_encode() [function.json-encode]:タイプはサポートされていません。5 行目の /code/ch6gVw で null としてエンコードされています [{"file":"/code/ch6gVw","line":8,"function" :"テスト","引数":[null]}]
ここで、次の 2 つのことが起こっていることがわかります。
- ロガー自体が警告を発しています! 悪い悪い悪い!
- ログに記録されたデータから、関数に null を渡したことがわかります?!?!
したがって、私の提案する解決策は次のようなものです。
foreach($trace as $i=>$v)
if(is_resource($v))
$trace[$i] = (string)$v.' ('.get_resource_type($v).')';
結果は次のようになりますResource id #1 (gd)
ただし、これは重大な問題を引き起こす可能性があります。
- 配列が自分自身を参照する無限ループに陥らないように、どの配列をループしたかを何らかの方法で追跡する必要があります (
$GLOBALS
この混乱を引き起こす傾向があります)。 - オブジェクト プロパティのリソースも変換する必要がありますが、オブジェクトは配列とは異なり、元のもののコピーではないため、プロパティを変更するとライブ オブジェクトが変更されます。一方、
clone()
対象物に対してどれくらい安全ですか? - このようなループはサーバーの速度を著しく低下させませんか (バックトレースは大きくなる傾向があります)。