在 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');
我正在尝试对以下描述的流进行一些“替换包装”: [文章][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');