通过 PHP 使用流时出现内存分配问题


Memory allocation problems while using a Stream through PHP

我通过使用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 字节("错误。

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

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

在不同的论坛上找到了我的答案。

内存耗尽问题的原因是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