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();

上面?的代码我随便写的,没有验证哈。伪代码!

newbing
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1
月光

我今天也发现了这个问题,append() 方法这么好用但在循环处理大文件的时候就坑了,还得用原生的函数处理,真是可惜。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!