如何解决在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 举报,一经查实,本站将立刻删除。