在 php 中传输大文件时如何解决 'Allowed memory size of' 错误?

how to solve 'Allowed memory size of' error when streaming big files in php?

我正在尝试对以下描述的流进行一些“替换包装”: [文章][1]

但是当我用不太大的文件(大约 120M)测试它时,它显示了一个错误:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 65011744 bytes) in C:\Apache22\htdocs\tuts\php\streams\filters\HiddenNameFilter.php on line 28

这是我的包装纸:

class HiddenNameFilter extends PHP_User_Filter
{
private $data;
private $limiter;

function onCreate()
{
    $this->data = '';
    $this->limiter = 2;
    return true;
}


function filter($in, $out, &$consumed, $closing)
{
    while($bucket = stream_bucket_make_writeable($in))
    {
        $this->data .= $bucket->data;
        $this->bucket = $bucket;
        $consumed = 0;
    }
    
    if($closing)
    {
        $consumed += strlen($this->data);
        $pattern = "/Andrii/m";
        $str = preg_replace($pattern, '0_+', $this->data);
        $this->bucket->data = $str;
        $this->bucket->datalen = strlen($this->data);

        if(!empty($this->bucket->data))
        {
            stream_bucket_append($out, $this->bucket);
        }

        return PSFS_PASS_ON;
    }

    return PSFS_FEED_ME;
}

}

这是我的客户端代码:

$handle = fopen(__DIR__ . '/big_file.txt', 'r');

stream_filter_register('myFilter', 'HiddenNameFilter');

stream_filter_append($handle, "myFilter");
$i = 0;
while($i != 30)
{
    $email = fgets($handle);
    if(!$email) break;

    $i++;
    $contents .= $email;
}
fclose($handle);
echo $contents;

我还在 [这里][2] 发现了一些 PHP 错误,但我不知道如何解决我的问题。

我有 PHP 7.3.7 (cli)(内置:2019 年 7 月 3 日 14:34:10)(ZTS MSVC15(Visual C++ 2017)x64) 在 windows 10/ 请帮忙) [1]: https://stackify.com/a-guide-to-streams-in-php-in-depth-tutorial-with-examples/ [2]: https://www.hashbangcode.com/article/php-custom-stream-filters

在php.ini中,存在一个限制内存的参数,找到你的php使用的默认php.ini,然后搜索“memory_limit”变量。它可能看起来像这样:

memory_limit = 64M

就算120M不算大,你可能默认有个下限

添加您的 php 代码 header

ini_set('memory_limit', '-1');