php获取对象的字节长度,用于标头

php获取对象的字节长度,用于标头,php,soap,content-length,Php,Soap,Content Length,我需要设置php标题(“Content-Length:Length”),其中Length是一个字节值。现在,由于post请求的大小可变,我已经任意将其设置为1MB,但我希望动态生成它,这样就不会有错误的数据 如何在将对象发送到服务器之前获取其字节大小。我正在进行soapCall,因此我必须在调用之前设置标题,而不是向curl或其他东西添加参数。我不熟悉SOAP,如果这不适用于您的情况,请原谅 不久前,我在一个个人项目中解决了这个问题,在这个项目中,我动态地生成了大拉链并将其发送给用户。我的解决方

我需要设置php
标题(“Content-Length:Length”)
,其中Length是一个字节值。现在,由于post请求的大小可变,我已经任意将其设置为1MB,但我希望动态生成它,这样就不会有错误的数据


如何在将对象发送到服务器之前获取其字节大小。我正在进行
soapCall
,因此我必须在调用之前设置标题,而不是向
curl
或其他东西添加参数。

我不熟悉SOAP,如果这不适用于您的情况,请原谅

不久前,我在一个个人项目中解决了这个问题,在这个项目中,我动态地生成了大拉链并将其发送给用户。我的解决方案是通过生成一次对象并记录其大小来预计算对象的大小。此解决方案的缺点是,如果对象的内容发生更改,则需要重新计算大小,但如果对象数量有限且大小不经常更改,则可能适合您

我使用的代码如下所示:

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 */

如果这对于你的目的来说太普遍了,也许考虑指定你发送给用户的“对象”。

你可以做下面的事情(应该有更好的,我知道):


字节数组的count()。soap不需要您设置它的头。如果是SOAP使用PHP SOAP扩展,它关心所有,如果是卷曲,那么这里使用SOAPPACK API?考虑使用输出缓冲,并使用为什么你需要<代码>内容长度< /Cord>头?您的服务器应该自动返回分块编码。@Vahidfarahm,我相信您,但如果我手动设置内容长度或不手动设置内容长度,我正在使用的api肯定会返回不同的结果。嗯,有人打我一巴掌让我醒来。我想这可能很好,因为php不是异步的,所以不会有其他事情同时发生,可能会改变结果。是的,我不想在多线程或异步环境中这样做。真恶心。PHP应该有一个更好的工具。事实上,这是我知道的唯一一种实现这一点的方法。还有其他人吗?
$before = memory_get_usage(TRUE);
$objectClone = clone $yourObject;
$after = memory_get_usage(TRUE);
$objectSize = $after - $before;  #size of your object
$objectClone = $null; #dispose of clone