【问题标题】:php get byte length of object, for headerphp获取对象的字节长度,用于标头
【发布时间】:2013-01-15 05:12:59
【问题描述】:

我需要设置phpheader("Content-Length: length"),其中length是一个字节值。现在,由于我的发布请求的大小可变,我已将其任意设置为 1 兆字节,但我想动态生成它,以免出现错误数据。

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

【问题讨论】:

  • count() 用于字节数组。
  • soap 不需要你设置它的标题。如果是 SOAP,则使用 PHP SOAP 扩展并且它会处理所有问题,如果是 CURL,那么 soapCall api 在这里有什么用?
  • 考虑使用输出缓冲并使用ob_get_length
  • 为什么需要Content-Length 标头?您的服务器应该会自动返回分块编码。
  • @VahidFarahmand 我相信你,但如果我手动设置 Content-Length,我与之通信的 api 肯定会返回不同的东西。

标签: php soap content-length


【解决方案1】:

您可以执行以下操作(应该有更好的方法,我知道):

$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

【讨论】:

  • uhmmmm,有人打我是为了叫醒我。我猜这可能很好,因为 php 不是异步的,所以不会同时发生其他可能会改变结果的事情
  • 是的,我不想在多线程或异步环境中执行此操作。太恶心了PHP 应该有更好的工具。
  • 事实上,这是我知道这样做的唯一方法。还有其他人吗?
【解决方案2】:

我不熟悉 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 */

如果这对于您的目的来说过于笼统,也许可以考虑指定您要发送给用户的“对象”。

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2014-04-30
    • 2023-01-12
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多