【问题标题】:HTTP 500 Internal Server Error with zlib.compressionzlib.compression 的 HTTP 500 内部服务器错误
【发布时间】:2014-12-05 11:04:04
【问题描述】:

我在我的 PHP 脚本中启用了zlib.compression

当我在启用输出缓冲(最大约 200 MB)的情况下提供少量数据时,一切正常。

但是,当我尝试提供更多数据时,我收到 HTTP 500 错误,尽管启用了日志记录并且 PHP 没有记录任何错误,但它确实有效。

PHP 没有设置任何输出处理程序(output_handler 没有值)。

<?php

ini_set('zlib.output_compression', 4096);

@ob_start();

header('Content-Type: application/octet-stream');
readfile('/tmp/bigfile.bin');

@ob_end_flush();

禁用输出缓冲(即没有ob_start() / ob_end_flush()),一切正常。

这里发生了什么?我该如何解决这个问题?

(上面的代码只是一个显示错误的示例;由于各种原因我需要输出缓冲,所以禁用它不是很好;如果可能的话,我更喜欢使用压缩)

【问题讨论】:

    标签: php zlib output-buffering http-compression


    【解决方案1】:

    原来是内存限制问题(在ob_*() 函数之前删除@ 会产生错误消息)。

    使用输出缓冲和 HTTP 压缩显然会消耗大量内存。

    我的内存限制为 1024 MB,脚本失败,文件为 230 MB。

    如果我们假设readfile() 将整个文件加载到内存中,然后将其交给输出缓冲,那么这仍然只是readfile() + 输出缓冲 + 压缩 ~ 230 MB + 230 MB + 230 MB + 一些用于压缩和缓冲的空间 ~ 仍然只有大约 800 MB,远低于 1024 MB...

    底线:不要对更大的数据使用压缩和输出缓冲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多