while ($data = fread($fp, 4096)) {
 var_dump(mb_convert_encoding($data,"SJIS","UTF-8"));<<--①
 //XMLパース処理
 if (!xml_parse($xml_parser,$data, feof($fp))) {
  //パースエラー処理
  die(sprintf("XML error: %s at line %d",
  xml_error_string(xml_get_error_code($xml_parser)),
  xml_get_current_line_number($xml_parser)));
 }
}

①の部分ですが、UTF-8のままじゃ文字化けするんでmb_convert_encodingしたんですが、そもそもデバッグ文なのでこれを変換するのも変だなということで、mb_convert_encodingを外しました。var_dump($data);
すると、画面には文字化け化け状態ですが、前回のように3分割はされませんでした。
string(4096) "0C4EG95T0RF88・・・・・ォ逋コ騾・/Availability>"
ってな感じです。

ついでになんか良く分からんですけど、これを入れたことにより文字切れの問題は解消しました。

C言語で原因不明の障害が出て、そのエラーを突き止めるためprint文を入れてみるとその障害自体がなくなるといった現象がありました。今にしてみればおそらくどこかでポインタの指定がまずくて出ていた不具合だと思いますが。

PHPってメモリとか直接さわるような言語でしたっけ?