【问题标题】:Memory allocation problems while using a Stream through PHP通过 PHP 使用 Stream 时的内存分配问题
【发布时间】:2016-05-18 15:18:06
【问题描述】:

我通过GuzzleHttp\Stream\Stream 类在PHP 中使用流。在使用它时,我遇到了 PHP 内存分配问题。有没有一种我可以使用的不占用太多内存的方法?

问题

当我需要提供 0-381855148 字节的内容范围(例如)时,这会导致我出现内存分配问题。有没有一种方法可以在不需要那么多内存的情况下提供内容?直接传递数据而不是“保留”在内存中的东西?

这是导致错误的代码的一部分...

$stream = GuzzleHttp\Stream\Stream::factory(fopen($path, 'r'));
$stream->seek($offset);
while (!$stream->eof()) {
    echo $stream->read($length);
}
$stream->close();

这是作为我的流的回调函数传递的。

背景

首先我尝试通过为我的流提供最大块长度来解决问题。我通过给我的流一个最大偏移量来做到这一点。它修复了内存分配问题,但在分发我的动态视频内容时,Firefox 出现了新问题。 Chrome 没有问题。

这是因为 Firefox 要求“0-”内容范围,但我返回内容范围“0-”。相反,我需要归还整个范围(直到最大值),但这会导致臭名昭著的“允许的 262144 字节内存大小用尽(试图分配 576 字节)”错误。

免责声明:它实际上有点技术性。但我想保持简单。

有人知道解决方案吗? 谢谢。

【问题讨论】:

  • 您收到错误消息或?
  • 允许的内存大小为 262144 字节已用尽(尝试分配 576 字节)是我得到的错误

标签: php memory video-streaming


【解决方案1】:

在另一个论坛上找到了我的答案。

内存耗尽问题的原因是 Guzzle 及其构建方式 (PSR-7)。

关于该问题的更深入的文章:https://evertpot.com/psr-7-issues/

我使用以下代码修复了它:

if ($i = ob_get_level()) {
    # Clear buffering:
    while ($i-- && ob_end_clean());
    if (!ob_get_level()) header('Content-Encoding: ');
}
ob_implicit_flush();

$fp = fopen($path, 'rb');
fseek($fp, $offset);
while ($length && !feof($fp)) {
    $chunk = min(8192, $length);
    echo fread($fp, $chunk);
    $length -= $chunk;
}
fclose($fp);

感谢 djmaze

【讨论】:

  • 在哪里添加此代码?它是添加还是替换代码行?
  • 应该使用这种方法而不是 Guzzle 方法。所以一个替代品,是的。
  • @sparkie 如何解决并继续使用GuzzleHttp\Client ?
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 2016-09-18
  • 2011-01-07
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多