2016-02-08 57 views
0

我在使用GuzzleHttp\Stream\Stream類的PHP中使用流。雖然使用它我得到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字節)」錯誤。

免責聲明:這實際上是一個更多的技術。但我想保持簡單。

有人知道解決方案嗎? 謝謝。

+0

您收到錯誤消息或? –

+0

允許內存大小爲262144字節耗盡(試圖分配576字節)是我得到的錯誤 – sparkle

回答

0

在另一個論壇上找到我的答案。

內存耗盡問題的原因是因爲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