問題が発生したときにスタック トレースを出力するのが好きです。debug_backtrace を使用して PHP で簡単に実行できます。ただし、問題は、ファイルのアップロードや画像のアップロードなどで問題が発生すると、トレースの一部として巨大なバイナリ ファイルが取得されることです。このように:(切り捨てられた)
#webgloo_ajax_error_handler() called at :0
1175 array (
1176 0 => 256,
1177 1 => 'Image_upload_error',
1178 2 => '/home/rjha/code/github/sc/webgloo/lib/com/indigloo/media/ImageUpload.php',
1179 3 => 95,
1180 4 =>
1181 array (
1182 'prefix' => 'test/2012/04/08/',
1183 'fieldName' => '120444-LM_menu_button.png',
1184 'sBlobData' => '<89>PNG^M
1185 ^Z
1186 ' . "\0" . '' . "\0" . '' . "\0" . '^MIHDR' . "\0" . '' . "\0" . '' . "\0" . 'P' . "\0" . '' . "\0" . '' . "\0" . '^^^H^F' . "\0" . '' . "\0" . '' . "\0" . '»C<99>±' . "\0" . '' . "\0" . '' . "\0" . '^AsRGB' . "\0" . '®Î^\é' . "\0" . '' . "\0" . '' . "\0" . '^FbKGD' . "\0" . 'ÿ' . "\0" . 'ÿ' . "\0" . 'ÿ ½§<93>' . "\0" . '' . "\0" . '' . "\0" . ' pHYs' . "\0" . '' . "\0" . '^K<88>' . "\0" . '' . "\0" . '^K<88>^Aå<8e>)I' . "\0" . '' . "\0" . '' . "\0" . '^GtIME^GÚ^B^R^V 5$=fÞ' . "\0" . '' . "\0" . '^PEIDAThÞÝ<9a>û<8f>]WuÇ?k<9f>sgl<8f>Ç<89>íøAH^P8<89>±<9d>8
理想的には、そのようなバイナリ ブロブをバック トレースから削除したいと考えています。PHPでバイナリ文字列を確実に検出する方法はありますか?
以下は私にとってはうまくいきません。主な理由は、解決策を徹底的にしたいからです。
- 名前に基づくフィルタリング (除外 .PNG など)
- 各データピース内の魔法の「数字」を探す
これが私の現在のバックトレースジェネレーターです
function backtrace() {
fwrite($this->fhandle," ---- __backtrace__ ----- \n" );
$trace = debug_backtrace();
$message = '' ;
foreach ($trace as $i=>$t) {
$message = sprintf("#%d %s%s%s() called at %s:%d \n",
$i,$t['class'], $t['type'],$t['function'],$t['file'],$t['line']);
fwrite($this->fhandle,$message);
$args = $t['args'];
if(!empty($args)) {
//remove blob strings from Argument
Util::unsetInArray($args,array('sBlobData','tBlobData'));
$this->dump($args);
}
}
}