私はSOAPに精通していないので、これがあなたの状況に当てはまらない場合はご容赦ください。
私の個人的なプロジェクトでは、この問題を少し前に解決する必要がありました。このプロジェクトでは、大きなZIPを動的に生成し、ユーザーにストリーミングしました。私の解決策は、オブジェクトを一度生成してそのサイズを記録することにより、オブジェクトのサイズを事前に計算することでした。このソリューションの欠点は、オブジェクトの内容が変更された場合にサイズを再計算する必要があることですが、サイズが頻繁に変更されないオブジェクトが有限数ある場合は、それでうまくいく可能性があります。
私が使用したコードは次のようになります。
ob_start();
$zip_length = 0;
$zip = new ZipStream();
foreach ($files as $virtual_path => $file_path) {
$zip->add_file_from_path($virtual_path, $file_path);
$zip_length += strlen(ob_get_contents());
ob_clean(); /* prevent excessive memory usage */
}
$zip->finish();
$zip_length += strlen(ob_get_contents());
ob_end_clean();
/* Store $zip_length somewhere */
これが目的に対して一般的すぎる場合は、ユーザーに送信する「オブジェクト」を指定することを検討してください。