Laravel Storage or Flysystem memory leak 的问题
昨晚上熬夜处理几十个CSV文档(接近2GB)的时候,使用了Laravel Storage::append 方法来保存数据,然后发现了内存没有释放的问题,现在简单分享一下吧。
原因
Flysystem 本身没有实现append 的方法,因为类似于S3/Aliyun OSS之类的第三方存储服务不支持append 的用法。Laravel Storage 的 append 方法的实现是把原始文件的内容读取出来,然后和append 的内容拼接在一起,最后写回文件。这个逻辑导致内存随着使用越来越大。(循环里面使用了)
解决方法一(偷点懒)
file_put_contents()
这个
file_put_contents
方法相当于封装了fopen
,fwrite
,fclose
几个函数的操作。使用Append 模式打开文件,写入数据就不会又内存没有释放的情况了。
但是呢,如果在循环里面使用file_put_contents
方法,频繁的fopen
,fclose
其实对性能还是有影响的。
最佳解决(不偷懒,多写两行代码)
fopen('path', 'w+');
foreach($contents as $content) {
fwrite($content);
}
fclose();
上面?的代码我随便写的,没有验证哈。伪代码!
我今天也发现了这个问题,append() 方法这么好用但在循环处理大文件的时候就坑了,还得用原生的函数处理,真是可惜。