微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在php中流式传输大文件时如何解决“允许的内存大小”错误?

如何解决在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;

我也发现了一些 PHP 错误 [here][2] 但我不知道如何解决我的问题。

我有 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代码头

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?